oauth2Client.getToken отсутствует маркер обновления


У меня есть небольшой экспресс-сервер, который имеет два маршрута. Затем он записывает токены json в файл (я знаю, что это очень небезопасно). По какой-то причине там нет refresh_token. В документах есть комментарий, что offline for access_type получает 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 () {})
1 5

1 ответ:

refresh_token отправляется только в том случае, если пользователь изначально авторизует ваше приложение с помощью своей учетной записи. Таким образом, функция getToken возвращает его только в первый раз (потому что вы должны хранить его). Добавлено approval_prompt: "force" в опции generateAuthUrl, и я могу получить его каждый раз.