【问题标题】:passportjs authentication using google apps email id使用谷歌应用程序电子邮件ID的passportjs身份验证
【发布时间】:2013-03-21 09:30:08
【问题描述】:

我正在尝试使用谷歌应用电子邮件 ID 的护照 js。我可以使用 gmail.com 电子邮件 ID 进行身份验证。但是,如果电子邮件 ID 是谷歌应用 ID (google.com/a/companyname.com),我如何进行身份验证。

这是我的代码

var express = require('express');
var app = express();
var passport = require('passport');
var GoogleStrategy = require('passport-google').Strategy;

passport.use(new GoogleStrategy({
    returnURL: 'http://10.3.0.52:3000/auth/google/return',
    realm: 'http://10.3.0.52:3000/'
},
function(identifier, profile, done) {
    User.findOrCreate({
        openId: identifier
    }, function(err, user) {
        done(err, user);
    });
}
));

app.get('/auth/google', passport.authenticate('google'));

app.get('/auth/google/return', 
    passport.authenticate('google', {
        successRedirect: '/',
        failureRedirect: '/login'
    }));

app.get('/', function(req, res){
    res.writeHead(200);

    res.end("connected");

});

app.listen(process.env.PORT || 3000);

【问题讨论】:

  • 我使用的是passport-google-oauth(使用OAuth2Strategy),我可以使用我的Google App地址登录。
  • 我编辑了我的代码,添加了我的代码,以便更好地理解。我认为我应该使用 passport-google-oauth。你能说出什么是“GOOGLE_CLIENT_ID”和“GOOGLE_CLIENT_SECRET”吗?

标签: javascript node.js express passport.js


【解决方案1】:

您的代码缺少一些重要部分:

...
passport.use(...); // this you have

// these are required as well.
app.use(passport.initialize());
app.use(passport.session());

// please read docs for the following two calls
passport.serializeUser(function(user, done) {
  done(null, user);
});

passport.deserializeUser(function(obj, done) {
  done(null, obj);
});
...

有了这些,我就可以使用我的 Google App 地址登录了。

编辑: 虽然它只适用于 Node 0.8,但 Node 0.10 会出错。我认为无论如何使用passport-google-oauth 是一个更好的解决方案。为此,您必须向 Google 注册您的应用程序 (here);注册后,您将获得可以使用的 GOOGLE_CLIENT_ID 和 GOOGLE_CLIENT_SECRET 代码。

【讨论】:

  • 如何限制用户仅从特定域登录。现在可以从 2 个不同的 google app id 登录。(name@abc.com,name2@xyz.com)。我希望 abc.com 中的用户只登录该应用程序。代码包含 abc.com 帐户的客户端 ID 和客户端密码。
  • This post 解释了如何使用某些 URL 参数来做到这一点。不过,我不确定是否可以将这些参数传递给 Passport。
  • @robertklep 为什么您认为passport-google-oauth 更好,请在提出更好的建议时提供理由!据我所知,没有任何好处,需要先创建一个应用程序......
  • @Linus 好吧,一方面,passport-google 在 Node 0.10 上不起作用(就像我说的那样)。此外,对于这种情况(使用 Google 凭据登录),Google 似乎也在推动 OAuth2 而不是 OpenID。
【解决方案2】:

我创建了一种方法来验证电子邮件域是否是我要授权的域:

UserSchema.method('checkFordomain', function(value) {
    var parts = value.split('@');
    return (parts[1] == 'companyname.com');
});

这是我放入用户模型的模型中的方法,使用猫鼬模式模型

if (!user.checkForMMdomain(profile.emails[0].value)) {
    return done();
}

在护照谷歌策略的回调中 https://github.com/jaredhanson/passport-google-oauth

【讨论】:

  • 这个答案不是这个问题的正确答案。我问了另一个问题stackoverflow.com/questions/15615557/…。后来我也得到了答案。因为您不需要在代码中验证应用程序域。
  • 甜蜜!正是我想要的。
  • 您的“正确”答案是建议编辑 oauth2.js 的源代码?当然,我知道 hd 参数,但它不起作用。所以接受答案。
  • @RajeeshV 在支持参数之前是最小的可行解决方案。如果您尝试部署应用程序会发生什么,您是在复制整个 node_modules 文件夹而不是 npm install 吗?您丢失了 node_modules 3rd 方库中的所有修改。所以接受答案。另外,如果您更新依赖项,对 hd 参数的支持已经在官方 repo 中。
【解决方案3】:

在您的passport.use 回调中,您可以根据主电子邮件地址的域(或您正在检查的任何内容)执行额外检查:

if (profile.emails[0].split('@')[1] !== authorizedDomain) {
    return done(null, false);
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-02-11
    • 2016-11-14
    • 2014-12-19
    • 2020-08-29
    • 1970-01-01
    • 1970-01-01
    • 2018-02-10
    • 1970-01-01
    相关资源
    最近更新 更多