Проблемы с аутентификацией Google API OAuth 2.0 с YouTube - PullRequest
0 голосов
/ 28 мая 2020

У меня проблемы с использованием API YouTube с аутентификацией OAuth 2.0. Я использую следующую слегка отредактированную версию примера кода, предоставленного YouTube / Google (также пробовал другой пример):

<!DOCTYPE html>
<html>
<head>
<script src="https://apis.google.com/js/api.js"></script>
</head>
<body>
<script>
  /**
   * Sample JavaScript code for youtubeAnalytics.reports.query
   * See instructions for running APIs Explorer code samples locally:
   * https://developers.google.com/explorer-help/guides/code_samples#javascript
   */

  function authenticate() {
    return gapi.auth2.getAuthInstance()
        .signIn({scope: "https://www.googleapis.com/auth/youtube.readonly"})
        .then(function() { console.log("Sign-in successful"); },
              function(err) { console.error("Error signing in", err); });
  }
  function loadClient() {
    gapi.client.setApiKey("my key edited out");
    return gapi.client.load("https://youtubeanalytics.googleapis.com/$discovery/rest?version=v2")
        .then(function() { console.log("GAPI client loaded for API"); },
              function(err) { console.error("Error loading GAPI client for API", err); });
  }
  // Make sure the client is loaded and sign-in is complete before calling this method.
  function execute() {
    return gapi.client.youtubeAnalytics.reports.query({
      "endDate": "2020-05-25",
      "ids": "channel==MINE",
      "metrics": "views,redViews,comments,likes,dislikes,videosAddedToPlaylists,videosRemovedFromPlaylists,shares,estimatedMinutesWatched,estimatedRedMinutesWatched,averageViewDuration,averageViewPercentage,subscribersGained,subscribersLost",
      "startDate": "2020-05-01"
    })
        .then(function(response) {
                // Handle the results here (response.result has the parsed body).
                console.log("Response", response);
              },
              function(err) { console.error("Execute error", err); });
  }
  gapi.load("client:auth2", function() {
    gapi.auth2.init({client_id: "my id edited out.apps.googleusercontent.com"});
  });
</script>
<button onclick="authenticate().then(loadClient)">authorize and load</button>
<button onclick="execute()">execute</button>
</body>
</html>

Используя Linux, я пробовал это с простым веб-сервером: python -m SimpleHTTPServer 8000, а также веб-сервер apache2 (даже попытался включить https :)

В запросе «Войти с помощью учетной записи Google» я ввожу свой пароль, затем он просит «Выбрать учетную запись» (Выберите, как использовать Google :). Если я выберу адрес электронной почты, он не выдаст мне никаких ошибок, но все возвращаемые данные - это все 0 (в части результатов ответа JSON), вероятно, потому что это не канал youtube. Если я выберу канал youtube, он выйдет из строя со следующим журналом (но он действительно войдет в меня в Google):

mutating the [[Prototype]] of an object will cause your code to run very slowly; instead create the object with the correct initial [[Prototype]] value using Object.create cb=gapi.loaded_0:250:89
mutating the [[Prototype]] of an object will cause your code to run very slowly; instead create the object with the correct initial [[Prototype]] value using Object.create 1894056769-idpiframe.js:8:88
GET 
XHR 
https://accounts.google.com/o/oauth2/iframerpc [HTTP/2.0 403 Forbidden 65ms]
Error signing in Object { type: "tokenFailed", idpId: "google", error: "server_error" } localhost:8000:18:31
authenticate/<() localhost:8000:18
Fk/e.Bl</e.zo<() cb=gapi.loaded_0:205
Ok() cb=gapi.loaded_0:208
Jk() cb=gapi.loaded_0:208
_.uk.prototype.nU() cb=gapi.loaded_0:208
tk() cb=gapi.loaded_0:200

Content Security Policy: Couldn't parse invalid host 'strict-dynamic' <unknown>
Content Security Policy: Couldn't parse invalid host 'report-sample' <unknown>
Content Security Policy: Ignoring "'unsafe-inline'" within script-src: nonce-source or hash-source specified <unknown>
GAPI client loaded for API localhost:8000:23:28
Execute error Object { result: Object, body: "{   "error": {     "code": 401,    …", headers: Object, status: 401, statusText: "Unauthorized" } localhost:8000:38:31
execute/<() localhost:8000:38
Fk/e.Bl</e.zo<() cb=gapi.loaded_0:205
Ok() cb=gapi.loaded_0:208
Jk() cb=gapi.loaded_0:208
_.uk.prototype.nU() cb=gapi.loaded_0:208
tk() cb=gapi.loaded_0:200

Использование другой версии браузера дает аналогичную ошибку:

"Error signing in" Object { type: "tokenFailed", idpId: "google", error: "server_error" } localhost:8000:18
authenticate/<() localhost:8000:18
Fk/e.Bl</e.zo<() cb=gapi.loaded_0:205
Ok() cb=gapi.loaded_0:208
Jk() cb=gapi.loaded_0:208
_.uk.prototype.nU() cb=gapi.loaded_0:208
tk() cb=gapi.loaded_0:200

"GAPI client loaded for API" localhost:8000:23
"Execute error" Object { result: Object, body: "{
  "error": {
    "code": 401,
    "message": "Request is missing required authentication credential. Expected OAuth 2 access token, login cookie or other valid authentication credential. See https://developers.google.com/identity/sign-in/web/devconsole-project.",
    "errors": [
      {
        "message": "Login Required.",
        "domain": "global",
        "reason": "required",
        "location": "Authorization",
        "locationType": "header"
      }
    ],
    "status": "UNAUTHENTICATED"
  }
}
", headers: Object, status: 401, statusText: "Unauthorized" } localhost:8000:38
execute/<() localhost:8000:38
Fk/e.Bl</e.zo<() cb=gapi.loaded_0:205
Ok() cb=gapi.loaded_0:208
Jk() cb=gapi.loaded_0:208
_.uk.prototype.nU() cb=gapi.loaded_0:208
tk() cb=gapi.loaded_0:200

Есть идеи?

...