【问题标题】:Node googleapis: getting Error: invalid_request after short period of time节点 googleapis:在短时间内出现错误:invalid_request
【发布时间】:2017-11-26 19:47:27
【问题描述】:

我正在使用节点 googleapis 库向 youtube 数据 api 发出请求。我开始使用passport passport-youtube-v3 库对用户进行身份验证。一切正常。我能够进行身份验证,并且可以向 youtube 数据 api 发出授权请求。但经过一定时间(大约 1-2 小时)后,凭据似乎已过期或失效,我收到以下错误:

{ Error: Invalid Credentials
    at Request._callback (/Users/flavio/Code/BA/node_modules/google-auth-library/lib/transporters.js:85:15)
    at Request.self.callback (/Users/flavio/Code/BA/node_modules/request/request.js:188:22)
    at emitTwo (events.js:106:13)
    at Request.emit (events.js:191:7)
    at Request.<anonymous> (/Users/flavio/Code/BA/node_modules/request/request.js:1171:10)
    at emitOne (events.js:96:13)
    at Request.emit (events.js:188:7)
    at IncomingMessage.<anonymous> (/Users/flavio/Code/BA/node_modules/request/request.js:1091:12)
    at IncomingMessage.g (events.js:286:16)
    at emitNone (events.js:91:20)
    at IncomingMessage.emit (events.js:185:7)
    at endReadableNT (_stream_readable.js:926:12)
    at _combinedTickCallback (internal/process/next_tick.js:74:11)
    at process._tickCallback (internal/process/next_tick.js:98:9)
  code: 401,
  errors: 
   [ { domain: 'global',
       reason: 'authError',
       message: 'Invalid Credentials',
       locationType: 'header',
       location: 'Authorization' } ] }

我了解身份验证令牌会在一段时间后过期。但根据the documentation,这不应该在 6 个月不活动之前发生。此外,我不会发出过多可能导致令牌无效的请求。尽管如此,我还是尝试像这样实现访问令牌的手动令牌刷新:

const fetch = (user, ressource, operation, opts) => {
  let oauth2Client = new OAuth2();
  let client = google.youtube({ version: 'v3',auth: oauth2Client })[ressource][operation];

  oauth2Client.credentials = {
      access_token: user.youtube.token,
      refresh_token: user.youtube.refreshToken
  };

  return new Promise((success, failure) => {
    client(opts, function(err, data, response) {
        if (err)
          if(err.code === 401)
            oauth2Client.refreshAccessToken(function(err, tokens) {
              console.log(err);
            });
          else
            failure(err);
        if (data)
          success(data);
    });
  });
}

我不确定我是否正确地实现了这一点,或者这样做是否有意义。我收到以下错误:

{ Error: invalid_request
    at Request._callback (/Users/flavio/Code/BA/node_modules/google-auth-library/lib/transporters.js:81:15)
    at Request.self.callback (/Users/flavio/Code/BA/node_modules/request/request.js:188:22)
    at emitTwo (events.js:106:13)
    at Request.emit (events.js:191:7)
    at Request.<anonymous> (/Users/flavio/Code/BA/node_modules/request/request.js:1171:10)
    at emitOne (events.js:96:13)
    at Request.emit (events.js:188:7)
    at IncomingMessage.<anonymous> (/Users/flavio/Code/BA/node_modules/request/request.js:1091:12)
    at IncomingMessage.g (events.js:286:16)
    at emitNone (events.js:91:20)
    at IncomingMessage.emit (events.js:185:7)
    at endReadableNT (_stream_readable.js:926:12)
    at _combinedTickCallback (internal/process/next_tick.js:74:11)
    at process._tickCallback (internal/process/next_tick.js:98:9) code: 400 }

出现第一个错误时还有什么问题?访问令牌是否有可能过期这么快?如果是,如何正确刷新?

非常感谢任何帮助!

【问题讨论】:

  • 我不确定问题出在哪里,因为您使用的是refresh_token,如果失败则意味着refresh_token 不再有效。您是否在 the authorized app list 中撤销了该应用程序?如果您之前的问题是这种情况,我发布了一个用户存储一次的答案,refresh_token 有效性未经过测试,因此如果您使用相同的方法,如果用户已撤销令牌,则不会更新手动。
  • 你可以试试this sample(我用passport-google-auth代替)
  • 感谢您的帮助!看起来错误出在其他地方。

标签: node.js youtube google-api youtube-api youtube-data-api


【解决方案1】:

问题似乎是我没有正确实例化OAuth2。创建时我没有将我的应用程序的凭据传递给构造函数。现在似乎一切正常。

let oauth2Client = new OAuth2(
  clientID,
  clientSecret,
  callbackURL
);

我唯一的困惑是为什么它在开始抛出上述错误之前对几个请求有效。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-12-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-05-04
    • 1970-01-01
    相关资源
    最近更新 更多