Ограничить вход в систему в определенный домен, используя паспорт узла с помощью Google Auth
-
26-12-2019 - |
Вопрос
Я реализую Google Auth на внутреннем сервисе на работе. Это HS Client Client Heavy Application с Backend узла. Я решил использовать модуль узла Passport.js с стратегией Passport-Google-Oauth.
Я успешно устроил это, но одна вещь все еще путает меня. Я хочу убедиться, что мое приложение позволяет только сотрудникам компании входить в систему. Я понимаю, что вы можете ограничить вход в систему доменом, используя параметр под названием «HD», в соответствии с официальной документацией
Во-первых, где вы отправляете этот параметр в контексте Passport.js? Я просто не понимаю, где в указанном коде. Если это поможет, я был в основном после того, как Пример Passport-Google-Oauth Обеспечивает .
Во-вторых, в теории, как это работает? Это на стороне Google, где они отвергают любого, кто пытается получить доступ к приложению с доменом за пределами нашей компании. Или это на моей стороне, что мне нужно проверить, в каком домене пользователь входит в систему?
Решение
Вот пример:
// 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"));
}
});
.
А для хорошей меры вот полная переменная дамп того, как выглядит переменная «профиль».
{
provider: 'google',
id: '12345678987654321',
displayName: 'Don Draper',
name: { familyName: 'Whitman', givenName: 'Richard' },
emails: [ { value: 'don@scdp.com' } ],
_raw: 'a bunch of stringified json',
_json: {
id: '123456789',
email: 'something@something.com',
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
в URL.Вы можете удалить этот и аутентификацию с любой учетной записью (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);
}
}));
.