【问题标题】:How to detect if an email is a Google Account?如何检测电子邮件是否为 Google 帐户?
【发布时间】:2010-11-24 06:00:14
【问题描述】:

我和这里的一些人正在创业。我们目前正在使用 Google OpenID API 来管理注册和登录到我们的应用程序,但我们希望迁移到更简单的用户注册模型。为此,我们需要知道是否有一种方法可以检测电子邮件(不是 gmail)是否已经是 Google 帐户。有没有办法从 Google Single Sign-on API 获取这些信息?

之前感谢您的帮助! :)

【问题讨论】:

  • 对于其他正在寻找与此相关的解决方案的人来说,这完全是一个技巧。如果您尝试邀请非 Google 电子邮件地址加入需要 Google 帐户(个人 gmail 或企业)的 Google 服务,如果该地址是非 Google 地址,您可能会收到类似“未知电子邮件地址”的错误消息。您可以用它来回答提出的问题。
  • Calendly 似乎在生产中这样做:calendly.com/signup
  • 在对此感到困惑一段时间后,我使用了“total hack”。之后找到了这个线程,但想确保我的解决方案已经被记录下来,并且我看到它已经被记录了。我将添加我的特定解决方案 - 尝试通过管理 API 将电子邮件添加为具有 GA 权限的用户。然后我立即删除用户权限。但如果我能够添加它,那么它就是一个有效的 Google 帐户。

标签: api openid single-sign-on google-account


【解决方案1】:

如果您使用的是 Mac,请打开终端并输入 $ host {example.com} 以确定他们的电子邮件是否由 Google 托管。

例如:

$ host yelp.com
yelp.com has address 104.16.57.23
yelp.com has address 104.16.56.23
yelp.com mail is handled by 1 ASPMX.L.GOOGLE.com.
yelp.com mail is handled by 10 ASPMX2.GOOGLEMAIL.com.
yelp.com mail is handled by 10 ASPMX5.GOOGLEMAIL.com.
yelp.com mail is handled by 10 ASPMX3.GOOGLEMAIL.com.
yelp.com mail is handled by 5 ALT2.ASPMX.L.GOOGLE.com.
yelp.com mail is handled by 10 ASPMX4.GOOGLEMAIL.com.
yelp.com mail is handled by 5 ALT1.ASPMX.L.GOOGLE.com.

【讨论】:

  • 简单又甜美!
  • 很好的解决方案!
【解决方案2】:

这不是一个完整的解决方案,但您可以通过查看某人域的 MX 记录来判断某人是否在使用 Google Apps。答案中的链接对我不起作用,所以这可能是一个更好的解决方案。

【讨论】:

  • 如果您在浏览器中打开该链接将无法正常工作.. 进行 curl 调用并检查标题状态
  • 在 PHP 中,使用 getmxrr 并将结果与​​ google 匹配。示例gist.github.com/samin/f89c0f9b67ae82200e22
【解决方案3】:

你不能那样做。我认为 Google 不会在未经用户同意的情况下告诉您。

但是,您可以通过将其用作发现 URL 来查看该域是否为 Google Apps 域: https://www.google.com/accounts/o8/site-xrds?hd=mail.moztw.org

请注意,域管理员可能未正确安装该域的 OpenID 支持。我的幻灯片对此进行了详细讨论: http://www.slideshare.net/timdream/google-apps-account-as-openid

【讨论】:

  • 感谢您的回复。当然做不到,从OpenID协议不提供任何用户交互支持这一点开始就说明了一切。事实上,我们已经在使用托管域检测。感谢您的建议! :)
  • 我建议你不要这样做。仅仅因为电子邮件地址在 G-Suite 域下并不一定意味着该人拥有 Google 帐户。不幸的是,有些 G-Suite 域并非如此,即。其中一些电子邮件地址只是转发器。
  • @rdb 是的,你是对的,答案只告诉给定域是否是 GSuite 域,而不是电子邮件本身。 OpenID 已被弃用,所以我自己会接受一粒沙子。
  • 嗨@FernandoEscher,即使我也遇到过类似的问题。你能帮我实现解决方案吗?我的意思是您如何使用托管域检测来解决问题。
【解决方案4】:

您可以使用 google api https://dns.google.com/resolve?name=example.com&type=MX 检查身份提供者

    public static class IdentityProviderChecker
    {
        public static async Task<string?> GetProviderName(string email)
        {
            var domainName = email.Split('@').Last();
            using var client = new HttpClient();

            var result = await client.GetAsyncResult<DnsResponse>($"https://dns.google.com/resolve?name={domainName}&type=MX");
            return result.Answer.Any(x => x.Data.Contains("google.com", StringComparison.OrdinalIgnoreCase) || x.Data.Contains("googlemail.com", StringComparison.OrdinalIgnoreCase))
                ? "Google"
                : result.Answer.Any(x => x.Data.Contains("outlook.com", StringComparison.OrdinalIgnoreCase))
                    ? "Microsoft"
                    : null;
        }
    }

    public class DnsResponse
    {
        public Answer[] Answer { get; set; } = null!;
    }

    public class Answer
    {
        public string Data { get; set; } = null!;
    }

【讨论】:

    【解决方案5】:

    我解决了 Doug 的建议,它奏效了。只需确保调用该函数的(有效)用户有权调用 addViewer。实现这一点的一个技巧是确保从触发例程调用例程,因此脚本的所有者是有效用户。

    function checkIfGoogleAccount(emailAddress) {
      try {
        SpreadsheetApp.getActiveSpreadsheet().addViewer(emailAddress) ;
        SpreadsheetApp.getActiveSpreadsheet().removeViewer(emailAddress) ;
        return true ;
      }
      catch(err) {
        return false ;
      }
    }
    

    【讨论】:

      【解决方案6】:

      请注意,MX 记录并不总能证明电子邮件地址能够执行 Google SSO/OAUTH。
      例如,gene.com (genentech) 使用 google 提供所有服务,但这是他们的 mx 响应:

      nslookup -type=mx gene.com
      Server:     127.0.0.53
      Address:    127.0.0.53#53
      
      Non-authoritative answer:
      gene.com    mail exchanger = 30 ridesmtaext02.roche.com.
      gene.com    mail exchanger = 60 mtaalt4.roche.com.
      gene.com    mail exchanger = 30 ridesmtaext01.roche.com.
      gene.com    mail exchanger = 40 rkamtaext01.roche.com.
      gene.com    mail exchanger = 40 rkamtaext02.roche.com.
      gene.com    mail exchanger = 40 rmumtaext02.roche.com.
      gene.com    mail exchanger = 30 sc1esmtaext02.gene.com.
      gene.com    mail exchanger = 30 sc1esmtaext01.gene.com.
      gene.com    mail exchanger = 60 mtaalt2.roche.com.
      gene.com    mail exchanger = 60 mtaalt3.roche.com.
      gene.com    mail exchanger = 40 rmumtaext01.roche.com.
      gene.com    mail exchanger = 60 mtaalt1.roche.com.
      
      Authoritative answers can be found from:
      

      【讨论】:

        【解决方案7】:

        我通过一个虚拟文件来做到这一点,我使用 addViewer 函数将电子邮件地址添加到该文件中。我尝试这样做……抓住。如果发现错误,那么我将我的本地标志设置为“不是谷歌帐户”。如果没有错误,然后我将它们作为我的虚拟文件的查看器删除,并设置我的标志以表明该电子邮件地址是合法的 google 帐户。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2022-07-11
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2016-08-20
          • 1970-01-01
          相关资源
          最近更新 更多