使用 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 & JWT & Google/Facebook 策略 - 如何结合 JWT 和 Google/Facebook 策略?
我可以使用 passport-google 回调来验证 android/ios 用户吗?