В прошлом я использовал ответ на на этот вопрос , чтобы настроить автоматический скрипт для добавления 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! Почему говорится, что я не авторизован, когда я только что успешно авторизовал ?!