26

アクセストークンを更新しようとするとエラーが発生します:

400不正な要求

{エラー: "unauthorized_client"}

GoogleトークンURIから:

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

何か問題でもありますか?

4

4 に答える 4

43

問題の説明

@MartinVがくれたヒントで、やっと修正できました!彼の答えはそれを解決する方法をうまく説明していないので、ここに投稿します。

問題は、全員がGoogle の OAuth Playgroundを使用してリフレッシュ トークンを生成したためですが、最初のステップで [Authorize APIs] をクリックすると、Playground アプリを使用して同意画面に移動します。その後、作成したすべてのトークンは Playground アプリでのみ使用できますが、もちろん、そのアプリのクライアント ID もクライアント シークレットもわかりません。

解決

解決策は、Playground が独自のクライアント ID とシークレットを使用するようにすることです。これを行うには、[設定] ボタンをクリックします。

遊び場の設定

クライアント ID とシークレットを入力します。ただし、それを行う前に、Developer's Consoleに移動し、 OAuth 2.0 クライアント IDクライアントを見つけて編集し、 Authorized redirect URIsの下にhttps://developers.google.com/oauthplaygroundを追加する必要があります。それを追加して変更を保存したら、プレイグラウンドに戻り、API の承認を試みます。私の場合、承認済みリダイレクト URIの変更が有効になるまでに 15 分ほどかかりました。

完了したら、Playground URI を開発者コンソールから削除することを忘れないでください。

追加

それを行ったら、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)
于 2017-01-09T20:55:43.817 に答える
15

OAuth2 プレイグラウンドでアクセス トークンとリフレッシュ トークンを作成し、それらをアプリにコピーしました。承認とトークンの更新に異なるクライアントを使用することはできません。

于 2012-12-18T19:08:48.417 に答える
0

私も同じ問題を抱えていました。解決策は、アプリケーションで承認するときとサーバーでトークンを更新するときに同じクライアントを使用することでした。

サーバー側で Google Calendar API のアクセス トークンを更新できない

于 2018-10-24T18:39:02.237 に答える