web-dev-qa-db-fra.com

Impossible d'actualiser le jeton d'accès: la réponse est "non autorisé_client"

Je reçois une erreur lorsque j'essaie d'actualiser le jeton d'accès:

400 mauvaise demande

{Erreur: "non autorisé_client"}

De Google Token Uri:

{
  "error" : "invalid_request"
}

J'ai lu cette réponse ici et la documentation Google officielle (qui décrit comment une requête POST devrait regarder) et je ne vois aucune différence.

J'ai capturé ma demande POST (Secrets supprimés):

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=******

Code Java qui envoie la demande:

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();

Y a-t-il quelque chose de mal?

18
Martin V.

J'ai créé l'accès et rafraîchir le jeton dans l'aire de jeux Oauth2, puis je les ai copiées à mon application. Il n'est pas autorisé à avoir différents clients pour l'autorisation et pour rafraîchir le jeton.

11
Martin V.

Explication problématique

Avec l'indice @martinv a donné, j'ai finalement pu le réparer! Parce que sa réponse n'explique pas très bien comment le résoudre, je vais le poster ici.

Le problème est dû au fait que nous avons tous généré le jeton d'actualisation en utilisant Playground de Google OAuth , mais lorsque vous cliquez sur "Autoriser les API" dans la première étape, il vous amène à l'écran Concent en utilisant l'application de playground. Après cela, tous les jetons que vous créez peuvent être utilisés uniquement par l'application de playground, mais bien sûr, vous ne connaissez pas l'ID client ou le secret du client pour cette application.

SOLUTION

La solution consiste à faire de la cour de jeu pour utiliser votre propre identifiant client et secret. Pour ce faire, cliquez sur le bouton Paramètres:

Playground settings

Et entrez votre identifiant client et votre secret. Mais, avant de faire cela, comme il l'est dit, vous devez vous rendre à la console de développeur , trouvez votre oauth 2.0 client IDS Client , Modifiez-le et add https://developers.google.com/oauthupleurground Sous Autorisé redirection URIS . Après avoir ajouté cela et enregistré les changements, revenez au terrain de jeu et essayez d'autoriser les API. Dans mon cas, il a fallu 15 minutes avant les modifications apportées au autorisée Redirection URIS a pris effet.

Une fois que vous avez terminé, n'oubliez pas de supprimer l'urion de terrain de jeu de la console de développeur!

[~ # ~] extra [~ # ~ ~]

Une fois que je l'ai fait, dans Python j'ai fait cela et cela a fonctionné:

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)
23
Diego Jancic

J'ai eu le même problème. La solution consistait à utiliser le même client lors de l'autorisation de l'application et lors de la mise à jour du jeton sur le serveur.

Impossible d'actualiser le jeton d'accès pour l'API de Calendrier Google sur le côté serveur

0
Artemius Pompilius

Une autre solution utilisant REST API pour obtenir un access_token Et ensuite l'utiliser pour interagir avec le REST API (E.G. Ajoutez une vidéo à une liste de lecture privée) après avoir créé le refresh_token comme décrit ci-dessus .

import requests
import json

# according to  https://stackoverflow.com/a/41556775/3774227
client_id = '<client_id>'
client_secret = '<client_secret>'
refresh_token = '<refresh_token>'

playlist_id = '<playlist>'
video_id = 'M7FIvfx5J10'


def get_access_token(client_id, client_secret, refresh_token):

    url = 'https://www.googleapis.com/oauth2/v4/token'

    data = {
        'client_id': client_id,
        'client_secret': client_secret,
        'refresh_token': refresh_token,
        'grant_type': 'refresh_token'
    }

    response = requests.post(
        url=url,
        data=data,
    )

    return response.json().get('access_token')


def add_video_to_playlist(playlist_id, video_id, access_token):

    url = 'https://www.googleapis.com/youtube/v3/playlistItems'

    params = {
        'part': 'snippet',
    }

    headers = {
        'Content-Type': 'application/json',
        'Authorization': 'Bearer {}'.format(access_token)
    }

    data = {
        'snippet': {
            'playlistId': playlist_id,
            'resourceId': {
                'kind': 'youtube#video',
                'videoId': video_id
            },
        }
    }

    requests.post(
        url=url,
        params=params,
        headers=headers,
        data=json.dumps(data)
    )


if __name__ == '__main__':
    access_token = get_access_token(client_id, client_secret, refresh_token)
    add_video_to_playlist(playlist_id, video_id, access_token)
0
Livioso