Не удалось обновить токен доступа: ответ "unauthorized_client"

Я получаю сообщение об ошибке при попытке обновить токен доступа:

400 Bad Request

{ошибка: "unauthorized_client" }

Из URI маркера Google:

{
  "error" : "invalid_request"
}

Я прочитал этот ответ здесь и официальную документацию Google (которая описывает, как должен выглядеть запрос POST), и я не вижу никакой разницы.

Я захватил мой запрос POST (секреты удалены):

POST /SHOWMERAWPOST HTTP/1.1
User-Agent: Google-HTTP-Java-Client/1.10.3-beta (gzip)
Pragma: no-cache
Host: requestb.in
Content-Type: application/x-www-form-urlencoded; charset=UTF-8
Content-Length: 175
Connection: keep-alive
Cache-Control: no-cache
Accept-Encoding: gzip
Accept: text/html, image/gif, image/jpeg, *; q=.2, */*; q=.2

grant_type=refresh_token&refresh_token=******&client_id=*******.apps.googleusercontent.com&client_secret=******

Java-код, который отправляет запрос:

RefreshTokenRequest req = new RefreshTokenRequest(new NetHttpTransport(), new JacksonFactory(), new GenericUrl(
                    getSecrets().getDetails().getTokenUri()), REFRESH_TOKEN);

           req.set("client_id", getSecrets().getDetails().getClientId());
           req.set("client_secret", getSecrets().getDetails().getClientSecret());

           TokenResponse response = req.execute();

Есть ли что-то не так?

Ответ 1

Я создал токен доступа и обновления на игровой площадке OAuth2, а затем скопировал их в свое приложение. Не разрешено иметь разные клиенты для авторизации и обновления токена.

Ответ 2

ОБЪЯСНЕНИЕ ПРОБЛЕМЫ

С подсказкой @MartinV я наконец смог исправить это! Поскольку его ответ не очень хорошо объясняет, как его решить, я отправлю его здесь.

Проблема заключается в том, что мы все создали токен обновления, используя Google OAuth Playground, но когда вы нажимаете "Авторизовать API" в первом шаг, он доставит вас на экран с помощью приложения Playground. После этого все маркеры, которые вы создаете, могут использоваться только приложением Playground, но, конечно же, вы не знаете ни идентификатора клиента, ни секрет клиента для этого приложения.

Решение

Решение состоит в том, чтобы заставить Playground использовать свой собственный идентификатор клиента и секрет. Для этого нажмите кнопку "Настройки":

Настройки игровой площадки

И введите свой идентификатор клиента и секрет. Но прежде чем вы это сделаете, как говорится там, вам нужно перейти в Консоль разработчика, найти свой клиент клиента ID OAuth 2.0, отредактировать его и добавьте https://developers.google.com/oauthplayground в Авторизованные URI переадресации. После того, как вы добавили это и сохранили изменения, вернитесь на площадку и попробуйте авторизовать API. В моем случае потребовалось 15 минут, прежде чем вступили в силу изменения в авторизированных URI-адресах перенаправления.

Как только вы закончите, не забудьте удалить URI игровой площадки из консоли разработчика!

EXTRA

Как только я это сделал, в Python я сделал это, и он сработал:

access_token = None 
client_id = 'xxxxxxxx.apps.googleusercontent.com'
client_secret = 'xxxxxxxxxxxx'
refresh_token = 'xxxxxxxxxxxx'
token_expiry = None
token_uri = "https://accounts.google.com/o/oauth2/token"
user_agent = 'YourAgent/1.0'

credentials = client.GoogleCredentials(access_token, client_id, client_secret, refresh_token, token_expiry, token_uri, user_agent)

http = credentials.authorize(httplib2.Http())
credentials.refresh(http)

service = build('drive', 'v3', http=http)
req = service.files().list()
resp = req.execute(http=http)