oauth2Client.getToken 失踪 refresh_token
oauth2Client.getToken missing refresh_token
我有一个有两条路由的小型快递服务器。然后它将 json 令牌写入文件(我知道非常不安全)。由于某种原因,没有 refresh_token
。在文档中有一条评论说 offline
for access_type
gets refresh_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 () {})
refresh_token
仅在用户最初使用他们的帐户授权您的应用程序时发送。所以它的 getToken
函数只有 returns 它第一次(因为你应该存储它)。在generateAuthUrl
选项中添加了approval_prompt: "force"
,每次都能搞定
更准确地说,只有当用户看到同意屏幕,也就是范围列表和“接受”按钮时,您才会得到 refresh_token 回复。用户将在第一次被要求授予访问权限时看到此屏幕,但在随后通过 OAuth 流程的行程中会跳过该屏幕(假设他们没有撤销访问权限)。但是,您可以通过在授权中传递 &prompt=consent 来强制用户再次看到同意屏幕 URL:
var url = oauth2Client.generateAuthUrl({
access_type: 'offline',
scope: scopes,
prompt: 'consent'
});
我有一个有两条路由的小型快递服务器。然后它将 json 令牌写入文件(我知道非常不安全)。由于某种原因,没有 refresh_token
。在文档中有一条评论说 offline
for access_type
gets refresh_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 () {})
refresh_token
仅在用户最初使用他们的帐户授权您的应用程序时发送。所以它的 getToken
函数只有 returns 它第一次(因为你应该存储它)。在generateAuthUrl
选项中添加了approval_prompt: "force"
,每次都能搞定
更准确地说,只有当用户看到同意屏幕,也就是范围列表和“接受”按钮时,您才会得到 refresh_token 回复。用户将在第一次被要求授予访问权限时看到此屏幕,但在随后通过 OAuth 流程的行程中会跳过该屏幕(假设他们没有撤销访问权限)。但是,您可以通过在授权中传递 &prompt=consent 来强制用户再次看到同意屏幕 URL:
var url = oauth2Client.generateAuthUrl({
access_type: 'offline',
scope: scopes,
prompt: 'consent'
});