我正在为我的服务器使用youtube数据api的v3.

                oauth2Client.getToken(req.query.code, function(err, token) {
                    if (err) {
                      console.log('Error while trying to retrieve access token', err);
                      return;
                    }
                    oauth2Client.credentials = token;
                    storeToken(token);
                    res.redirect("/channel");
                  });

我将此令牌存储在本地,但我有以下几个问题:;

  1. 在即将发出请求时,如何判断此令牌是否有效?
  2. 如果我当前拥有的令牌已过期,如何使用刷新令牌获取新令牌?

推荐答案

确定令牌是否有效的最佳方法是使用它.对于访问令牌,只需使用它进行调用.对于刷新令牌,答案是相同的.使用它来创建新的访问令牌.

node .js客户端库应该为您处理访问令牌的所有刷新.

此代码第一次运行文件时,将在包含用户同意的TOKEN\u路径中创建文件,这是刷新令牌.如果文件存在,将根据需要使用该文件创建新的访问令牌.

const fs = require('fs');
const readline = require('readline');
const {google} = require('googleapis');

// If modifying these scopes, delete token.json.
const SCOPES = ['https://www.googleapis.com/auth/youtube'];
// The file token.json stores the user's access and refresh tokens, and is
// created automatically when the authorization flow completes for the first
// time.
const TOKEN_PATH = 'token.json';

// Load client secrets from a local file.
fs.readFile('credentials.json', (err, content) => {
  if (err) return console.log('Error loading client secret file:', err);
  // Authorize a client with credentials, then call the Google Tasks API.
  authorize(JSON.parse(content), listConnectionNames);
});

/**
 * Create an OAuth2 client with the given credentials, and then execute the
 * given callback function.
 * @param {Object} credentials The authorization client credentials.
 * @param {function} callback The callback to call with the authorized client.
 */
function authorize(credentials, callback) {
  const {client_secret, client_id, redirect_uris} = credentials.installed;
  const oAuth2Client = new google.auth.OAuth2(
      client_id, client_secret, redirect_uris[0]);

  // Check if we have previously stored a token.
  fs.readFile(TOKEN_PATH, (err, token) => {
    if (err) return getNewToken(oAuth2Client, callback);
    oAuth2Client.setCredentials(JSON.parse(token));
    callback(oAuth2Client);
  });
}

/**
 * Get and store new token after prompting for user authorization, and then
 * execute the given callback with the authorized OAuth2 client.
 * @param {google.auth.OAuth2} oAuth2Client The OAuth2 client to get token for.
 * @param {getEventsCallback} callback The callback for the authorized client.
 */
function getNewToken(oAuth2Client, callback) {
  const authUrl = oAuth2Client.generateAuthUrl({
    access_type: 'offline',
    scope: SCOPES,
  });
  console.log('Authorize this app by visiting this url:', authUrl);
  const rl = readline.createInterface({
    input: process.stdin,
    output: process.stdout,
  });
  rl.question('Enter the code from that page here: ', (code) => {
    rl.close();
    oAuth2Client.getToken(code, (err, token) => {
      if (err) return console.error('Error retrieving access token', err);
      oAuth2Client.setCredentials(token);
      // Store the token to disk for later program executions
      fs.writeFile(TOKEN_PATH, JSON.stringify(token), (err) => {
        if (err) return console.error(err);
        console.log('Token stored to', TOKEN_PATH);
      });
      callback(oAuth2Client);
    });
  });
}

Node.js相关问答推荐

CloudTasksClient在Firebase Function % s onDocumentCreated中实例化时导致错误

使用HTTPS从NodeJS 17.9.1升级到18.0.0后,SignalR连接失败

聚合发布/订阅消息

Node.js中Redis的并发问题

npm错误;无法解析依赖项:npm ERR!对等webpack@;5.x.x;来自@webpack-cli/serve@2.0.5";

车把模板引擎循环问题

找不到 vue-template-compiler@2.6.14 的匹配版本 | Shopware 6.5 更新后的 node 问题

Postgressql的BIGSERIAL自增序列,即使由于唯一约束错误没有创建行,也会自动增加

我应该转译我的 TypeScript 应用程序吗?

TypeError:在使用 Jest、Supertest、Express、Typescript 进行测试时无法读取未定义的属性(读取listen)

module.exports=require('other') 和临时变量有什么区别?

根据 mongoDB 中存在的唯一字符串生成唯一字符串的最佳方法

aws cdk 2.0 init 应用程序无法构建更漂亮的问题,这来自 jest-snapshot

响应发送 200 而不是 403

如何将子集合添加到 Firestore 中的文档?

使用 NodeJS 将新对象附加到 DynamoDB 中的 JSON 数组

如何让should.be.false语法通过 jslint?

mongo 可以 upsert 数组数据吗?

使用 gzip/deflate 压缩的简单 HTTP 请求

如何从 Node.js 应用程序Ping?