YouTube Analytics Goolge授权

时间:2018-03-26 10:48:50

标签: javascript express google-authentication google-apis-explorer youtube-analytics-api

我正在尝试授权我的服务器通过模块调用youtube analytics api" googleapis" (https://www.npmjs.com/package/googleapis)。我想用JWT授权。正如你所看到的,我从api中得到了一个禁止的错误。

我读了很多帖子并且整整一段时间,但是我无法弄清楚出了什么问题。

我的代码好吗?否则它将成为谷歌云相关问题。 (例如,我没有在那里正确设置角色。)



 import fs from 'fs';
import { google } from 'googleapis';

// read credentials from file
const credentialsFromFile = fs.readFileSync(`${__dirname}/../credentials.json`);
const credentials = JSON.parse(credentialsFromFile.toString());

const scopes = [
  'https://www.googleapis.com/auth/youtube.readonly',
  'https://www.googleapis.com/auth/yt-analytics-monetary.readonly',
  'https://www.googleapis.com/auth/youtubepartner',
];

// get an authorized client
const jwtClient = new google.auth.JWT(
  credentials.client_email,
  null,
  credentials.private_key,
  scopes
);

const youtubeAnalyticsClient = google.youtubeAnalytics({
  version: 'v1',
  auth: jwtClient,
});

function runQuery(callback) {
  youtubeAnalyticsClient.reports.query(
    {
      auth: jwtClient,
      ids: 'channel==MINE',
      'start-date': '2018-01-01',
      'end-date': '2018-02-01',
      metrics: 'views',
    },
    (error, result) => {
      if (error) console.log(error.errors);
      else {
        console.log(result);
        callback(result);
      }
    }
  );
}

jwtClient.authorize((error, result) => {
  if (error) console.log(error);
  else {
/*
  { access_token: '{THE ACCESS TOKEN}',
  token_type: 'Bearer',
  expiry_date: 1522070090000,
  refresh_token: 'jwt-placeholder' } */
    console.log(result);

    runQuery(() => {
      // worked :)
    });
  }
});




响应对象可能会有所帮助:



  response: 
   { status: 403,
     statusText: 'Forbidden',
     headers: 
      { vary: 'X-Origin, Origin,Accept-Encoding',
        'content-type': 'application/json; charset=UTF-8',
        date: 'Mon, 26 Mar 2018 10:39:33 GMT',
        expires: 'Mon, 26 Mar 2018 10:39:33 GMT',
        'cache-control': 'private, max-age=0',
        'x-content-type-options': 'nosniff',
        'x-frame-options': 'SAMEORIGIN',
        'x-xss-protection': '1; mode=block',
        server: 'GSE',
        'alt-svc': 'hq=":443"; ma=2592000; quic=51303432; quic=51303431; quic=51303339; quic=51303335,quic=":443"; ma=2592000; v="42,41,39,35"',
        'accept-ranges': 'none',
        connection: 'close' },
     config: 
      { adapter: [Function: httpAdapter],
        transformRequest: [Object],
        transformResponse: [Object],
        timeout: 0,
        xsrfCookieName: 'XSRF-TOKEN',
        xsrfHeaderName: 'X-XSRF-TOKEN',
        maxContentLength: 2147483648,
        validateStatus: [Function],
        headers: [Object],
        method: 'get',
        url: 'https://www.googleapis.com/youtube/analytics/v1/reports',
        paramsSerializer: [Function],
        data: undefined,
        params: [Object] },
     request: 
      ClientRequest {
        domain: null,
        _events: [Object],
        _eventsCount: 6,
        _maxListeners: undefined,
        output: [],
        outputEncodings: [],
        outputCallbacks: [],
        outputSize: 0,
        writable: false,
        _last: true,
        upgrading: false,
        chunkedEncoding: false,
        shouldKeepAlive: false,
        useChunkedEncodingByDefault: false,
        sendDate: false,
        _removedConnection: false,
        _removedContLen: false,
        _removedTE: false,
        _contentLength: 0,
        _hasBody: true,
        _trailer: '',
        finished: true,
        _headerSent: true,
        socket: [Object],
        connection: [Object],
        _header: 'GET /youtube/analytics/v1/reports?ids=channel%3D%3DMINE&start-date=2018-01-01&end-date=2018-02-01&metrics=views HTTP/1.1\r\nAccept: application/json, text/plain, */*\r\nAuthorization: Bearer ya29.c.El6KBUokXWf8yjN1LXk04b3FTGa1jadNEmvbyLBQfVmK9KIbxwxA6e88m_OujuTcyrJW60ojwnKiNfH-9E2iegmwlDOdKI8VxORrniGIt9gc_FGp2tvi2GLabzTri74b\r\nUser-Agent: google-api-nodejs-client/1.3.2\r\nHost: www.googleapis.com\r\nConnection: close\r\n\r\n',
        _onPendingData: [Function: noopPendingOutput],
        agent: [Object],
        socketPath: undefined,
        timeout: undefined,
        method: 'GET',
        path: '/youtube/analytics/v1/reports?ids=channel%3D%3DMINE&start-date=2018-01-01&end-date=2018-02-01&metrics=views',
        _ended: true,
        res: [Object],
        aborted: undefined,
        timeoutCb: null,
        upgradeOrConnect: false,
        parser: null,
        maxHeadersCount: null,
        _redirectable: [Object],
        [Symbol(outHeadersKey)]: [Object] },
     data: { error: [Object] } },
  code: 403,
  errors: [ { domain: 'global', reason: 'forbidden', message: 'Forbidden' } ] }




更新1

我稍微更新了代码,因此这与此示例实现类似:https://github.com/google/google-api-nodejs-client/blob/HEAD/samples/jwt.js

我在代码中看到了一个授权客户端,但是发生了同样的错误。我很确定我搞砸了谷歌云设置中的设置。在本地开发时,是否有必要在Google云端进行域名验证?

更新2

即使使用OAuth2身份验证(在浏览器中允许范围后将代码作为cli arg传递),我也会收到禁用错误。好像我需要在云开发控制台中启用它,但我该怎么做?

0 个答案:

没有答案