我正在尝试使用node.js的passport模块返回一个refreshToken。 但是我使用下面的代码,我无法记录任何刷新令牌,但访问令牌工作正常。 有没有办法为这个模块指定脱机访问类型,希望能够返回这个?
var GoogleStrategy = require('passport-google-oauth').OAuth2Strategy;
passport.use(new GoogleStrategy({
clientID: GOOGLE_CLIENT_ID,
clientSecret: GOOGLE_CLIENT_SECRET,
callbackURL: "http://myurl/auth/callback"
},
function(accessToken, refreshToken, profile, done) {
console.log(refreshToken);
process.nextTick(function () {
return done(null, [{token:accessToken}, {rToken:refreshToken}, {profile:profile}]);
});
}
));
这会将refreshToken返回为undefined。
非常感谢任何帮助。
答案 0 :(得分:22)
通过以下链接解决了这个问题:
https://github.com/jaredhanson/passport/issues/42
具体是:
passport.authenticate('google', { scope: ['https://www.googleapis.com/auth/userinfo.profile',
'https://www.googleapis.com/auth/userinfo.email'],
accessType: 'offline', approvalPrompt: 'force' });
杰瑞德汉森 - 祝福你。
答案 1 :(得分:4)
您需要的只是accessType: 'offline'
并且首次登录时会获得 refreshToken 。
您在请求中不需要 approvalPrompt
或prompt
。
注意这仅适用于首次登录,如果您未捕获并保存 refreshToken 并在首次登录时将其与用户帐户关联,则无法轻松获取再一次。
如果您在第一次登录时没有捕获它,则有两个选项:
如果用户登录并且您没有 refreshToken ,则可以立即强制将其注销并告诉他们转到https://myaccount.google.com/permissions并撤消访问权限到您的应用程序然后再次登录。
当他们再次登录时,他们将获得与首次登录时相同的访问提示,并且您将在第一次新登录时获得 refreshToken 。确保在Passport中的回调中有一个方法,将 refreshToken 保存到数据库中的用户配置文件中。
然后,您可以在需要调用Google API时使用 refreshToken 请求轮换 accessToken 。
您还可以添加accessType: 'offline'
和prompt: 'consent'
选项,但这可能不是您在基于Web的应用程序中所需的。
使用这些功能会提示每个用户在每次登录时批准对您的应用的访问权限。尽管有这个名称,但 approvalPrompt 并没有强制执行此操作,至少在当前版本的API中没有强制执行(根据提及它的人数以及oAuth API更改的频率来判断,这种行为完全可能是不同)。
对于基于网络的应用来说,这不是一个很好的方法,因为它不是一个出色的用户体验,但可能对调试有用。