7

我有一个小型快递服务器,有两条路线。然后它将 json 令牌写入文件(我知道非常不安全)。由于某种原因,没有refresh_token. 在 docs theres a comment that offlinefor access_typegetsrefresh_token已设置但仍无法正常工作

access_type: 'offline', // 'online' (default) or 'offline' (gets refresh_token)

这是快递服务器,如果承诺让任何人失望,请见谅。

var Promise = require("bluebird")
var express = require('express')
var app = express()

var google = require('googleapis')
var OAuth2 = google.auth.OAuth2
var clientSecrets = require("./client_secrets.json")
var oauth2Client = new OAuth2(clientSecrets.web.client_id, clientSecrets.web.client_secret, clientSecrets.web.redirect_uris[0]);
oauth2Client.getToken = Promise.promisify(oauth2Client.getToken)

var fs = Promise.promisifyAll(require("fs"))

app.get('/google', function (req, res) {
  var url = oauth2Client.generateAuthUrl({
    access_type: 'offline',
    scope: "https://www.googleapis.com/auth/drive"
  })
  return res.redirect(url)
})

app.get('/oauth2callback', function (req, res) {
  return oauth2Client.getToken(req.query.code).then(function(tokens){
    fs.writeFileAsync("./tokens.json", JSON.stringify(tokens), "utf8");
    return res.json(tokens)
  }).catch(function(err){
    return res.redirect("/google")
  })
})

var server = app.listen(3000, function () {})
4

2 回答 2

18

仅当refresh_token用户最初使用他们的帐户授权您的应用程序时才会发送。所以它的getToken函数只在第一次返回它(因为你应该存储它)。添加approval_prompt: "force"generateAuthUrl选项中,我每次都能得到它。

于 2015-02-17T15:36:38.900 回答
0

更准确地说,当用户看到同意屏幕时,您只会得到一个 refresh_token,也就是范围列表和“接受”按钮。用户第一次被要求授予访问权限时会看到此屏幕,但在随后通过 OAuth 流程时会跳过该屏幕(假设他们没有撤销访问权限)。但是,您可以通过在授权 URL 中传递 &prompt=consent 来强制用户再次查看同意屏幕:

var url = oauth2Client.generateAuthUrl({
  access_type: 'offline',
  scope: scopes,
  prompt: 'consent'
});
于 2022-02-22T03:51:05.667 回答