Как определить, является ли электронная почта учетной записью 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.