Ограничить вход в систему в определенный домен, используя паспорт узла с помощью Google Auth

StackOverflow https://stackoverflow.com//questions/23065104

Вопрос

Я реализую 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' 
    } 
}
.

Вот несколько подробных учебных пособий, которые должны ответить на ваш вопрос о теории всех этого.Вы хотите некоторую комбинацию двух.

  1. Локальная аутентификация и базовая настройка li>
  2. Google Аутентификация

Другие советы

Я рекомендую 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);
    }

}));
.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top