Получение unauthorized_client при попытке получить токены OAuth2 для API Google Фото - PullRequest
0 голосов
/ 01 февраля 2020

В прошлом я использовал ответ на на этот вопрос , чтобы настроить автоматический скрипт для добавления sh новых листов в Google Sheets. Сейчас я пытаюсь сделать то же самое для получения информации о Google Фото.

Я использовал игровую площадку OAuth2 для получения токена refre sh, так как для этого требуется интерактивная часть утверждения, которую не может использовать автоматический скрипт , В моем коде node.js у меня есть эта функция для получения нового токена:

function OAuth2() {
    // from the oauth playground
    const refresh_token = <<refresh token>>
    // from the API console
    const client_id = <<client id>>
    // from the API console
    const client_secret = <<secret>>
    // from https://developers.google.com/identity/protocols/OAuth2WebServer#offline
    const refresh_url = "https://www.googleapis.com/oauth2/v4/token";

    const post_body = `grant_type=refresh_token&client_id=${encodeURIComponent(client_id)}&client_secret=${encodeURIComponent(client_secret)}&refresh_token=${encodeURIComponent(refresh_token)}`;

    let refresh_request = {
        body: post_body,
        method: "POST",
        headers: {
            'Content-Type': 'application/x-www-form-urlencoded'
        }
    }

    return fetch(refresh_url, refresh_request).then( response => {
            return(response.json());
    }).then( response_json =>  {
    console.log(response_json)
        return response_json.access_token
    })
}

Все это работало в предыдущем проекте, я просто скопировал / вставил код в новый проект. Но когда я вызываю эту функцию, я получаю эту ошибку:

{ error: 'unauthorized_client', error_description: 'Unauthorized' }

Я также пытался использовать токен доступа непосредственно с игровой площадки OAuth2, но он также не работает:

[Symbol(Response internals)]: {
    url: 'https://photoslibrary.googleapis.com/v1/mediaItems?pageSize=100',
    status: 401,
    statusText: 'Unauthorized',
    headers: Headers { [Symbol(map)]: [Object: null prototype] },
    counter: 0
  }

Однако У меня нет проблем с запуском этого запроса напрямую с игровой площадки OAuth2 с использованием тех же токенов и всего прочего, что я только что сгенерировал и вставил в свой скрипт. Но это не подходящее решение - мне нужно запустить его в скрипте, потому что мне нужно сделать несколько сотен вызовов API.

Я также видел этот вопрос , в котором, по-видимому, это возможно получить обновленный токен доступа, который, как я думал, был невозможен из сценария командной строки. Однако предоставленный ответ использует "redirect_uri = REDIRECT_URL", и я не знаю, каким должен быть этот REDIRECT_URL. Насколько я понимаю, он должен указывать на страницу, которую я обслуживаю, но нет сервера, он запускается из командной строки. Я попытался использовать URL-адрес перенаправления OAuth2 Playground для получения:

    const access_url = `https://accounts.google.com/o/oauth2/auth?redirect_uri=${encodeURIComponent("https://developers.google.com/oauthplayground")}&response_type=code&client_id=${encodeURIComponent(client_id)}&scope=${encodeURIComponent("https://www.googleapis.com/auth/photoslibrary.readonly")}&approval_prompt=force&access_type=offline`

Но это возвращает неверный запрос 400.

Обновление: Я пытался ввести свои собственные учетные данные OAuth на детской площадке OAuth2. Но это дает мне следующую ошибку:

400. That’s an error.

Error: redirect_uri_mismatch

Обновление 2:

Я следовал инструкциям здесь , подставляя их в область Google Фото. Я вставил URL-адрес в браузер и дал разрешение, а затем получил токен доступа после успешной аутентификации. Но когда я пытаюсь использовать это в своем приложении, я получаю 401 Несанкционированный! Если я использовал токен refre sh для получения нового токена доступа, он работает, но когда я пытаюсь использовать этот токен, я также получаю 401 Unauthorized! Почему говорится, что я не авторизован, когда я только что успешно авторизовал ?!

...