使用Node.js和Google&;登录OAuth 2;Javascript

使用Node.js和Google&;登录OAuth 2;Javascript,javascript,node.js,oauth,Javascript,Node.js,Oauth,这是我先前问题的后续 应用程序首先重定向到谷歌 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

这是我先前问题的后续

应用程序首先重定向到谷歌

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();


});
它重定向到google以获取代码,然后当它返回时,调用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!");
});
就目前而言,这还可以。然而,当我下次登录时,使用相同的谷歌帐户,我会得到不同的代码和令牌。尽管原始登录和授权同时返回令牌和刷新令牌,但后续尝试没有刷新令牌

由于它们不同,无法判断用户是否已登录,我们是否已获得授权

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

因此,我如何使用谷歌登录并找到用户而不刷新令牌-因为稍后我将使用访问令牌获取用户谷歌帐户的其他部分,如文档、电子邮件、任务等

提前谢谢

好的,我会处理好的

基本上不是使用OAuth2进行登录和授权,而是使用OpenId进行登录,使用OAuth2进行授权

OpenId功能由passport和passport google提供

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);
}));
然后让Google让用户登录

app.get('/GoogleLogin.html',passport.authenticate('google', { failureRedirect: '/login' }),
    function(req, res) {
        res.redirect('/');  
});
当谷歌返回时,使用之前创建的策略

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

});
处理登录和访问用户帐户的授权与我最初的问题完全相同