2013-03-21 88 views
1

我想與谷歌應用程序電子郵件ID護照js。我能夠使用gmail.com電子郵件ID進行身份驗證。但是,如果電子郵件ID是谷歌應用程序ID(google.com/a/companyname.com),我如何才能進行身份驗證。passportjs認證使用谷歌應用程序電子郵件ID

這是我的代碼

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); 
+1

我使用[護照谷歌-的OAuth(https://github.com/jaredhanson/ passport-google-oauth)(使用'OAuth2Strategy'),我可以使用我的Google App地址登錄就好了。 – robertklep 2013-03-21 09:42:30

+0

我編輯了我的代碼,添加了我的代碼,以便更好地理解..我應該使用passport-google-oauth。你能告訴什麼是「GOOGLE_CLIENT_ID」和「GOOGLE_CLIENT_SECRET」。 – 2013-03-21 09:49:08

回答

2

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

... 
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); 
}); 
... 

與那些在地方,我可以登錄使用我的谷歌應用程序的地址就好了。

編輯:它只適用於節點0.8,但節點0.10給出了一個錯誤。無論如何,我認爲使用passport-google-oauth是一個更好的解決方案。爲此,您必須向Google註冊您的應用程序(here);註冊後,您將獲得可以使用的GOOGLE_CLIENT_ID和GOOGLE_CLIENT_SECRET代碼。

+0

如何限制用戶僅從特定域登錄。現在可以從2個不同的谷歌應用ID登錄([email protected],[email protected])。我希望abc.com中的用戶只能登錄到應用程序。代碼包含abc.com帳戶的客戶端ID和客戶端密碼。 – 2013-03-21 12:03:41

+1

[這篇文章](http://stackoverflow.com/a/11001585/893780)解釋瞭如何使用特定的URL參數。不過,我不確定是否可以將這些參數傳遞給Passport。 – robertklep 2013-03-21 12:43:14

+0

@robertklep你爲什麼認爲'passport-google-oauth'更好,請提供一個理由,當提出更好的東西!據我所見,沒有任何好處,並需要先創建一個應用程序... – 2013-04-02 15:34:49

1

我創建了驗證,如果電子郵件域是一個我要授權的方法:

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

+0

此答案不是此問題的正確答案。我已經問了另一個問題http://stackoverflow.com/questions/15615557/need-to-redirect-to-google-app-email-login-page-instead-of-normal-gmail-login-in。我後來得到了答案。在這一點上,你不需要在代碼中驗證應用程序域。 – 2013-04-01 04:19:17

+0

甜!正是我在尋找的東西。 – 2014-04-07 17:30:55

1

在你passport.use回調喲ü可以進行基於主電子郵件地址的域名額外的檢查(或任何你正在檢查):

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