使用 Node Passport 和 Google Auth 限制登录到特定域

Posted

技术标签:

【中文标题】使用 Node Passport 和 Google Auth 限制登录到特定域【英文标题】:Restrict login to specific domain using Node Passport with Google Auth 【发布时间】:2014-05-28 17:00:38 【问题描述】:

我正在工作中的内部服务上实施 Google 身份验证。它是一个带有 Node 后端的 JS 客户端繁重的应用程序。我选择将 Node 模块 Passport.js 与 passport-google-oauth 策略一起使用。

我已经成功地让它工作了,但有一件事仍然让我感到困惑。我想确保我的应用程序只允许公司员工登录。我知道您可以使用名为“hd”的参数according to the official documentation 来限制域登录。

首先,您在 Passport.js 的上下文中将该参数发送到哪里?我只是不明白代码放在哪里。如果有帮助,我主要关注the example passport-google-oauth provides。

其次,理论上这一切是如何运作的?是在谷歌方面,他们拒绝任何人试图使用我们公司以外的域访问该应用程序。还是在我这边,我需要检查用户从哪个域登录?

【问题讨论】:

【参考方案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: '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' 
     

这里有一些详细的教程,可以回答您关于所有这些背后的理论的问题。您需要将两者结合起来。

    Local authentication and basic setup Google authentication

【讨论】:

profile._json.hd 现在似乎是 profile._json.domain【参考方案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);
    

));

【讨论】:

谢谢查理!它适用于我使用 passport-google-oauth2

以上是关于使用 Node Passport 和 Google Auth 限制登录到特定域的主要内容,如果未能解决你的问题,请参考以下文章

Passport Node.js CORS 错误

Passport & JWT & Google/Facebook 策略 - 如何结合 JWT 和 Google/Facebook 策略?

我可以使用 passport-google 回调来验证 android/ios 用户吗?

使用 passport.js 将本地策略连接到另一个(Facebook、Twitter、Google 等)

如何正确使用 Passport.js?

如何允许用户在 Node JS Passport JS 失败后尝试不同的电子邮件?