OAuth 2使用Node.js和Google&Javascriptlogin

这是我先前提出的问题的一个后续行动。 来自Node.js的Javascript中getToken的invalid_request

该应用程序首先redirect到谷歌;

app.get('/GoogleLogin.html',function(req,res) { var scopes = ""; // retrieve google scopes scopes += config.google_login.scopes.baseFeeds + " " scopes += config.google_login.scopes.calendar + " " scopes += config.google_login.scopes.drive + " " scopes += config.google_login.scopes.driveMetadata + " " scopes += config.google_login.scopes.profile + " " scopes += config.google_login.scopes.email + " " scopes += config.google_login.scopes.tasks var url = oauth2Client.generateAuthUrl({ access_type: 'offline', scope: scopes }); res.writeHead(302, {location: url}); res.end(); }); 

它redirect到谷歌获取代码,然后当它返回时,它调用oauth2Client.getToken为了将该代码转换为记号。

 app.get('/AuthorizeGoogle.html',function(req,res) { var queryData = url.parse(req.url,true).query; var code = queryData.code; var access_token = ""; oauth2Client.getToken(code,function(err,tokens) { if (err == null) { oauth2Client.setCredentials(tokens); access_token = tokens.access_token; googleapis .discover('plus','v1') .withAuthClient(oauth2Client) .execute(function(err, client) { if (err) { console.log('An error occured'); } else { getUserProfile(client, oauth2Client, 'me', function(err, profile) { if (err) { console.log('An error occured retrieving the profile'); } else { } }); } }); } else { console.log("There seems to be a problem; " + err); } res.send("Authorized!"); }); 

这样就可以了。 但是,当我下次login,使用相同的谷歌帐户,我得到一个不同的代码和令牌。 虽然原始login和授权返回一个令牌和刷新令牌 – 后续的尝试没有刷新令牌。

因为它们不同,所以无法告诉用户是否已经login,并且我们已经被授权。

当我在C#中做同样的事情 – 我可以使用令牌来search数据库,并将其与用户链接。

那么,如何才能使用Googlelogin并find用户,而无需刷新令牌 – 因为后来我将使用访问令牌来获取用户Google帐户的其他部分,如文档,电子邮件,任务等。

提前致谢

好样的pipe理它。

基本上,而不是使用OAuth 2login和授权 – 我使用OpenIdlogin和OAuth2授权。

OpenIdfunction由护照和护照 – 谷歌提供。

 var passport = require('passport'); var GoogleStrategy = require('passport-google').Strategy; app.use(passport.initialize()); app.use(passport.session()); 

你需要初始化护照

 passport.use(new GoogleStrategy({ returnURL: 'http://localhost:81/AuthenticateGoogleLogin.html', realm: 'http://localhost:81/', clientID: config.google_login.client_id, clientSecret: config.google_login.client_secret, }, function(identifier, profile, done) { return done(null,profile); })); 

然后你让Googlelogin用户

 app.get('/GoogleLogin.html',passport.authenticate('google', { failureRedirect: '/login' }), function(req, res) { res.redirect('/'); }); 

Google返回时,使用之前创build的策略

 app.get('/AuthenticateGoogleLogin.html', passport.authenticate('google', { failureRedirect: '/Problem.html' }), function(req, res) { }); 

处理login和访问用户帐户的权限与我原来的问题完全一样。