Как определить, является ли электронная почта учетной записью Google?

Я и некоторые ребята здесь работаем над стартапом. В настоящее время мы используем Google OpenID API для управления регистрацией и входом в наше приложение, но мы хотим перейти на более простую модель регистрации пользователей. И для этого нам нужно знать, есть ли способ определить, является ли электронная почта (не gmail) уже учетной записью Google. Есть ли способ получить эту информацию из Google Single Sign-on API?

Предыдущее спасибо за вашу помощь!:)

8 ответов

Решение

Тебе этого не сделать. Я не думаю, что Google мог бы сказать вам это без согласия пользователя.

Однако вы можете посмотреть, является ли домен доменом Служб Google, используя его в качестве URL-адреса обнаружения: https://www.google.com/accounts/o8/site-xrds?hd=mail.moztw.org

Отмечено, что администратор домена может неправильно установить поддержку OpenID для домена. На моем слайде это подробно обсуждалось: http://www.slideshare.net/timdream/google-apps-account-as-openid

Если вы на 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.

Это не полное решение, но вы можете узнать, есть ли кто-то в Службах Google, просмотрев записи MX своего домена. Ссылка в ответе не работает для меня, так что это может быть лучшим решением.

Вы можете проверить поставщика удостоверений с помощью API Google 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!;
    }

Обратите внимание, что записи MX не всегда подтверждают, что адрес электронной почты может выполнять SSO / OAUTH в Google.
Например, 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:

Я разработал предложение Дуга, и оно работает. Просто убедитесь, что (эффективный) пользователь, вызывающий функцию, имеет право вызывать addViewer. Хитрость для достижения этой цели заключается в том, чтобы убедиться, что подпрограмма вызывается из триггерной подпрограммы, поэтому владелец сценария является эффективным пользователем.

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

Пришел в поисках решения этой проблемы и хотел опубликовать обновление о том, что, хотя решение Doug/Lexcel работает, команда .addViewer() теперь автоматически отправляет электронное письмо (если учетная запись основана на Google), уведомляя человека о том, что ему было предоставлено представление. доступ к файлу. Поскольку это не идеально, я переписал функцию, чтобы вместо этого использовать Drive API для автоматической вставки разрешения.

      function checkIfGoogleAccount(email) {
  let ss = SpreadsheetApp.getActiveSpreadsheet() ;
  let fileId = ss.getId() ;
  try {
    Drive.Permissions.insert( // Silent share - doesn't send an email
      {
        'role': 'reader',
        'type': 'user',
        'value': email
      },
      fileId,
      {
        'sendNotificationEmails': 'false'
      }) ;
    ss.removeViewer(email) ;
    return true ;
  } catch (e) {
    return false ;
  }
}

Я делаю это, имея фиктивный файл, к которому я добавляю адрес электронной почты, используя функцию addViewer. Я делаю это в попытке... поймать. Если ошибка обнаружена, тогда я устанавливаю свой локальный флаг, чтобы сказать "не учетная запись Google". Если ошибок нет, я удаляю их как средство просмотра моего фиктивного файла и устанавливаю свой флаг, чтобы адрес электронной почты был действительной учетной записью Google.

Другие вопросы по тегам