Кажется, я не могу найти никакой документации о том, как ограничить вход в мое веб-приложение (которое использует OAuth2.0 и API Google), чтобы принимать запросы аутентификации только от пользователей с электронной почтой на определенном доменном имени или наборе доменных имен. Я хотел бы внести в белый список, а не в черный список.
Есть ли у кого-нибудь предложения о том, как это сделать, есть документация по официально принятому способу сделать это или простой и безопасный способ решения проблемы?
Для записи: я не знаю никакой информации о пользователе, пока он не попытается войти в систему через аутентификацию Google OAuth. Все, что я получаю в ответ, - это основная информация о пользователе и электронная почта.
google-api
oauth-2.0
google-oauth
парадокс870
источник
источник
Ответы:
Итак, у меня есть для вас ответ. В запросе oauth вы можете добавить «hd = domain.com», и это ограничит аутентификацию для пользователей из этого домена (я не знаю, можете ли вы использовать несколько доменов). Вы можете найти задокументированный параметр hd здесь
Я использую библиотеки api google отсюда: http://code.google.com/p/google-api-php-client/wiki/OAuth2, поэтому мне пришлось вручную отредактировать файл /auth/apiOAuth2.php на этот :
Изменить: я все еще работаю над этим приложением и нашел это, что может быть более правильным ответом на этот вопрос. https://developers.google.com/google-apps/profiles/
источник
hd
параметр вcreateAuthUrl
функции, вам все равно необходимо убедиться, что пользователь входит в систему с адресом электронной почты вашего домена. Изменить параметр ссылки очень просто, чтобы разрешить все адреса электронной почты и впоследствии получить доступ к вашему приложению.hd
использованию параметров см. На developers.google.com/identity/work/it-apps. Ссылку наhd
параметр URI можно найти на developers.google.com/identity/protocols/… В синопсисеhd
параметр должен быть рассматривается как фильтр отображения на основе домена для стороны Google Auth, но все же должен быть проверен на вашей стороне.hd
параметре я могу ограничить только один домен. Что делать, если я хочу ограничить два или три домена?Сторона клиента:
Используя
auth2
функцию init, вы можете передатьhosted_domain
параметр, чтобы ограничить учетные записи, перечисленные во всплывающем окне входа, теми, которые соответствуют вашемуhosted_domain
. Вы можете увидеть это в документации здесь: https://developers.google.com/identity/sign-in/web/referenceНа стороне сервера:
Даже с ограниченным списком на стороне клиента вам нужно будет убедиться, что он
id_token
соответствует указанному размещенному домену. Для некоторых реализаций это означает проверкуhd
атрибута, который вы получаете от Google после проверки токена.Пример полного стека:
Веб-код:
gapi.load('auth2', function () { // init auth2 with your hosted_domain // only matching accounts will show up in the list or be accepted var auth2 = gapi.auth2.init({ client_id: "your-client-id.apps.googleusercontent.com", hosted_domain: 'your-special-domain.com' }); // setup your signin button auth2.attachClickHandler(yourButtonElement, {}); // when the current user changes auth2.currentUser.listen(function (user) { // if the user is signed in if (user && user.isSignedIn()) { // validate the token on your server, // your server will need to double check that the // `hd` matches your specified `hosted_domain`; validateTokenOnYourServer(user.getAuthResponse().id_token) .then(function () { console.log('yay'); }) .catch(function (err) { auth2.then(function() { auth2.signOut(); }); }); } }); });
Код сервера (с использованием библиотеки googles Node.js):
Если вы не используете Node.js, вы можете просмотреть другие примеры здесь: https://developers.google.com/identity/sign-in/web/backend-auth
const GoogleAuth = require('google-auth-library'); const Auth = new GoogleAuth(); const authData = JSON.parse(fs.readFileSync(your_auth_creds_json_file)); const oauth = new Auth.OAuth2(authData.web.client_id, authData.web.client_secret); const acceptableISSs = new Set( ['accounts.google.com', 'https://accounts.google.com'] ); const validateToken = (token) => { return new Promise((resolve, reject) => { if (!token) { reject(); } oauth.verifyIdToken(token, null, (err, ticket) => { if (err) { return reject(err); } const payload = ticket.getPayload(); const tokenIsOK = payload && payload.aud === authData.web.client_id && new Date(payload.exp * 1000) > new Date() && acceptableISSs.has(payload.iss) && payload.hd === 'your-special-domain.com'; return tokenIsOK ? resolve() : reject(); }); }); };
источник
При определении вашего провайдера передайте хэш в конце с параметром hd. Вы можете прочитать об этом здесь. https://developers.google.com/accounts/docs/OpenIDConnect#hd-param
Например, для config / initializers / devise.rb
источник
Вот что я сделал с помощью паспорта в node.js.
profile
пользователь пытается войти в систему.Затем просто создайте логику для поиска нескольких доменов вместо одного. Я считаю, что этот метод безопасен, потому что 1. символ «@» не является допустимым символом в первой или второй части адреса электронной почты. Я не мог обмануть эту функцию, создав адрес электронной почты, например
mike@fake@google.com
2. В традиционной системе входа я мог, но этот адрес электронной почты никогда не мог существовать в Google. Если это недействительная учетная запись Google, вы не сможете войти в систему.источник
С 2015 года в библиотеке есть функция, позволяющая установить это без необходимости редактировать исходный код библиотеки, как в обходном пути от aaron-bruce
Перед созданием URL просто позвоните
setHostedDomain
своему клиенту Googleисточник