Passport – Node.js不返回刷新令牌

我正在尝试使用node.js的护照模块返回一个refreshToken。 不过,我正在使用下面的代码,我无法logging任何刷新令牌,但访问令牌工作正常。 有没有什么办法指定访问types离线为这个模块希望返回这个?

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。

任何帮助将不胜感激。

这是通过这个链接解决的:

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

Jared Hanson – 祝福你。

所有你需要的是accessType: 'offline' ,你将在第一次login时得到refreshToken

不需要 approvalPrompt在请求中promptprompt

注意, 这只适用于第一次login,如果你没有捕获并保存refreshToken并将其与用户帐户关联在第一次login时,你不能再轻易得到它。

如果在第一次login时没有捕获到它,则有两个选项:

  1. 如果用户login且您没有refreshToken ,您可以立即强制登出,并告诉他们去https://myaccount.google.com/permissions并撤销对您的应用程序的访问,然后login再次。

    当他们再次login时,他们将获得与第一次login时相同的提示,您将获得第一次新login时的refreshToken 。 只要确保在Passport中的callback中有一个方法将refreshToken保存到他们在数据库中的用户configuration文件。

    然后,您可以在需要调用Google API时使用refreshToken来请求旋转的accessToken

  2. 您还可以添加accessType: 'offline'prompt: 'consent'选项,但是这可能不是您想要的基于Web的应用程序。

    使用这些将会提示每个用户在每次login时批准您的应用的访问权限。 尽pipe名字, ApprovalPrompt并没有强制执行,至less不是在当前版本的API中(根据提及的人数和oAuth API改变的频率来判断,这种行为以前是完全不同的)。

    对于基于networking的应用程序,这不是一个好方法,因为这不是一个好的用户体验,但对debugging可能有用。