使用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) {
});
处理登录和访问用户帐户的授权与我最初的问题完全相同