Ограничение входа в определенный домен с помощью 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);
    }

}));