40

通常、Google OAuth2.0 メカニズムはうまく機能しています。

  1. ユーザーは、選択したスコープで Google アカウントにアクセスする権限を確認します。
  2. リフレッシュ トークンが取得され、長期ストレージに保存されます。
  3. 必要なたびに (アクセス トークンの有効期限が切れた場合)、アクセス トークンが取得され、API へのアクセスに使用されます。

しかし、ときどき (これまでのところ、6 か月以上にわたって 2 回だけ) 奇妙な動作を経験しました。

Google API へのリクエストで、無効な資格情報 (401) エラーが返されます。(保存されている更新トークンを使用して) アクセス トークンを更新しても役に立ちません。

この問題をテストしたときに得た構造化された出力を次に示します。

    + -------------------------------------------------- ------------------------ +
    | | 1.トークンを更新しようとしています。| |
    | | 2.トークンの更新が完了しました。| |
    + -------------------------------------------------- ------------------------ +
    | | アクセス: ************************************************ **** |
    | | 更新: ******************************************** |
    | | 有効期限: 3600 |
    | | 作成: 2013-07-23 13:12:36 |
    + -------------------------------------------------- ------------------------ +

また、リクエストをhttps://www.googleapis.com/oauth2/v1/tokeninfoに送信して、「新しい」アクセス トークンを検証しようとしました 。

    + -------------------------------------------------- ------------------------ +
    | | 1.トークンを確認しようとしています。| |
    | | 2. トークンのチェックを完了します。| |
    + -------------------------------------------------- ------------------------ +
    | | 発行先: ************.apps.googleusercontent.com |
    | | オーディエンス: ************.apps.googleusercontent.com |
    | | ユーザー ID: ************ |
    | | 有効期限: 3600 |
    | | 電子メール: **********@gmail.com |
    | | 検証済み_電子メール: 1 |
    | | access_type: オフライン |
    | | スコープ:: |
    + -------------------------------------------------- ------------------------ +
    | | https://www.googleapis.com/auth/userinfo.email |
    | | https://www.googleapis.com/auth/userinfo.profile |
    | | https://www.googleapis.com/auth/plus.me |
    | | https://www.googleapis.com/auth/drive |
    + -------------------------------------------------- ------------------------ +

しかし、ドライブ フィードにアクセスしようとすると、次のような応答が返されます。

    GET の呼び出しエラー https://www.googleapis.com/drive/v2/files (401) 無効な資格情報

    ドメイン: グローバル
    理由: authError
    メッセージ: 資格情報が無効です
    locationType: ヘッダー
    場所: 認可

カレンダーでも同じ問題が発生しました。そう:

  1. トークンは以前は有効でした (すべてが機能していました)。
  2. トークンの更新は引き続き機能します。
  3. フィードをリクエストすると、「資格情報が無効です」というエラーが返されます。
  4. 他のすべてのトークンは引き続き正常に機能しており、コードが有効であることを意味します。

通常、トークンが取り消されると、トークンを更新しようとすると「invalid_grant」エラーが返されます。

質問

  1. この動作の理由は何ですか? リフレッシュ トークンが取り消された、または他の方法で無効になった場合、新しいアクセス トークンの要求でエラーが発生する必要がありますか?
  2. リフレッシュトークンを検証する方法はありますか?
4

13 に答える 13

22

エラーとエラー コードに関する Google API ドキュメント:

https://developers.google.com/drive/handle-errors#401_invalid_credentials

401: Invalid Credentials

Invalid authorization header. The access token you're using is either expired or invalid.

error: {
  errors: [
   {
  "domain": "global",
  "reason": "authError",
  "message": "Invalid Credentials",
  "locationType": "header",
  "location": "Authorization",
  }
  ],
  "code": 401,
  "message": "Invalid Credentials"
  }
}

これはエラーのバージョンと正確に一致するため、Google があなたのリクエストで間違っていると考えている可能性が非常に高いです。

しかし、ご存じのとおり、Google API リクエストは、問題を実際に診断するのに明らかに役に立たないエラーを返すことがあります。いくつかの理由で「無効な資格情報」エラーが発生しました。ほとんどの場合、問題ではないと思っていた何らかの変更を行ったため、実際には問題が発生します。

私が最初に考えた (ここでは暗闇で撮影) は、Google API コンソールに移動することです。

https://code.google.com/apis/console

Google の認証トークン検証ツール ( https://www.googleapis.com/oauth2/v1/tokeninfo ) は有効な応答を返すことができますが、クライアント シークレットまたはクライアント ID が変更されている可能性があります。

応答本文のわずかな変更でも、このエラーが発生する可能性があります。

REST 呼び出しによるものかクライアント ライブラリによるものかはわかりませんが、コマンド ライン インターフェイスで API 呼び出しを行うことができる ruby​​ lib を使用しています。これと OAuth2 Playground は、Google API 呼び出しの診断に非常に役立ちます。

参考までに、Google API から「無効な認証情報」と「不十分なアクセス許可」の 2 つのエラーしか表示されませんでした。後者は、ほとんどの場合、不適切なスコープに関係しています。前者はそれ以外のすべてです。

また、6 か月間でエラーが 2 回しか発生していない場合は、幸運です。

于 2013-07-23T18:00:37.113 に答える
9

GoogleコンソールでリダイレクトURLを変更してから、サーバーでjson資格情報ファイルを更新しようとしたときに、この問題が発生しました。新たに開始する前に、セッション変数をクリアする必要がありました。したがって、プロジェクトでこれを1回だけ実行します。

session_start(); //starts a session
session_unset(); //flushes out all the contents previously set

空運転後は忘れずに取り外してくださいsession_unset()

于 2016-09-26T07:28:07.030 に答える
4

私は開発環境にいます。私もこの問題を抱えていました。

まず、資格情報を更新してみました。検索結果はありません。次に、アプリを削除し (私はまだ開発環境にいるので問題ありませんでしたが、既に運用環境で使用している場合はこのアクションに注意してください)、新しいアプリを作成し、クライアントの資格情報 JSON を更新しました.. . まだ、結果はありません。

Googleアカウントにログインしていない新しいブラウザインスタンス(Firefoxを使用しているため、プライベートブラウジング)で開き、Googleアカウントに再度ログインして、クライアント(Webアプリケーション)を使用してみました。 )。期待どおり認証画面にリダイレクトされ、その後は問題なく動作しました。

于 2016-12-14T21:36:34.337 に答える
2

最近、この奇妙なエラーが発生しました。私の修正: AuthUrlにリダイレクトする前に、すべてのセッションの設定を解除する関数を配置しました。

于 2016-09-15T22:56:52.577 に答える
0

c:\Users\[user]\.credentials のファイル json を削除したときに、この問題を解決しました。

于 2017-09-02T23:11:23.190 に答える