Ограничение входа в определенный домен с помощью Node Паспорт с Google Auth
Я внедряю Google Auth во внутреннюю службу на работе. Это тяжелое приложение JS-клиента с бэкэнд Node. Я предпочитаю использовать модуль Node Passport.js с паспорт-google-oauth.
Я успешно заработал, но меня все еще путают. Я хочу, чтобы мое приложение разрешало входам только сотрудники компании. Я понимаю, что вы можете ограничить регистрацию по домену, используя параметр "hd", в соответствии с официальной документацией.
Во-первых, где вы отправляете этот параметр в контексте Passport.js? Я просто не понимаю, где в коде, который ставится. Если это помогает, я в основном придерживался примера паспорта - google-oauth.
Во-вторых, теоретически, как это все работает? Это на стороне Google, где они отвергают любого, кто пытается получить доступ к приложению с доменом за пределами нашей компании. Или это на моей стороне, что мне нужно проверить, в какой домен пользователь входит?
Ответы
Ответ 1
Вот пример:
// first make sure you have access to the proper scope on your login route
app.get("/login", passport.authenticate("google", {
scope: ["profile", "email"]
});
// set up your Google OAuth strategy elsewhere...
passport.use(new GoogleStrategy({
clientID: "something",
clientSecret: "something",
callbackURL: "/something"
}, function(token, refreshToken, profile, done){
if(profile._json.hd === "yourdomain.com"){
// find or create user in database, etc
User.find({ id: profile.id }).done(done);
}else{
// fail
done(new Error("Invalid host domain"));
}
});
И для хорошей меры здесь полный свал переменной, как выглядит переменная "profile".
{
provider: 'google',
id: '12345678987654321',
displayName: 'Don Draper',
name: { familyName: 'Whitman', givenName: 'Richard' },
emails: [ { value: '[email protected]' } ],
_raw: 'a bunch of stringified json',
_json: {
id: '123456789',
email: '[email protected]',
verified_email: true,
name: 'Don Draper',
given_name: 'Don',
family_name: 'Draper',
link: 'https://plus.google.com/123456789',
picture: 'https://lh3.googleusercontent.com/XdUIqdMkCWA/AAAAAAAAAAI/AAAAAAAAAAA/123456789/photo.jpg',
gender: 'male',
locale: 'en',
hd: 'yourdomain.com'
}
}
Вот несколько подробных руководств, которые должны ответить на ваш вопрос об теории, лежащей в основе всего этого. Вам понадобится комбинация из двух.
Ответ 2
Я рекомендую двухэтапный подход к этому. Хотелось бы услышать обратную связь, если это слишком сложно.
1) Помогите своим пользователям выбрать правильный аккаунт
passport.authenticate('google', {
// Only show accounts that match the hosted domain.
hd: 'example.com',
// Ensure the user can always select an account when sent to Google.
prompt: 'select_account',
scope: [
'https://www.googleapis.com/auth/plus.login',
'https://www.googleapis.com/auth/plus.profile.emails.read'
]
})(req, res, next);
2) Подтвердить свой профиль
Когда пользователь отправляется на accounts.google.com
для аутентификации, в URL-адресе есть простой параметр запроса hd=example.com
. Вы можете удалить это и выполнить проверку подлинности с любой учетной записью (Passport успешно проверит Oauth-код независимо от домена выбранной учетной записи), поэтому его следует рассматривать только как сахар для конечного пользователя, а не для сервера.
Когда Passport разрешает аутентификацию, просто проверьте размещенный домен, как в ответе aembke:
passport.use(new google_strategy({
clientID: ...
clientSecret: ...
callbackURL: ...
}, function(token, tokenSecret, profile, done) {
if (profile._json.domain !== 'example.com') {
done(new Error("Wrong domain!"));
} else {
done(null, profile);
}
}));