2013-07-23 26 views
27

通常、Google OAuth2.0のメカニズムはうまく機能しています。OAuth2.0トークンの異常な動作(無効な資格情報401)

  1. ユーザーは、選択した範囲でGoogleアカウントにアクセスする許可を確認します。
  2. リフレッシュトークンが取得され、長時間のストレージに保存されます。
  3. アクセストークンが期限切れになった場合に必要なアクセストークンがすべて取得され、APIへのアクセスに使用されます。

しかし、時には(6ヶ月以上のため、これまで2回だけ)私は奇妙な行動を経験した:GoogleのAPIに

要求が無効な資格情報(401)エラーを返します。 (格納されたリフレッシュトークンを使用して)アクセストークンを更新することは役に立ちません。ここで

は、この問題をテストするときに、私が持っているいくつかの構造化され出力されます:

 
    + ------------------------------------------------------------------------- + 
    | 1.TRYING TO REFRESH THE TOKEN.           | 
    | 2.DONE REFRESHING THE TOKEN.            | 
    + ------------------------------------------------------------------------- + 
    | access:   **************************************************** | 
    | refresh:     ********************************************* | 
    | expires:               3600 | 
    | created:           2013-07-23 13:12:36 | 
    + ------------------------------------------------------------------------- + 

私も https://www.googleapis.com/oauth2/v1/tokeninfo

 
    + ------------------------------------------------------------------------- + 
    | 1. TRYING TO CHECK THE TOKEN .           | 
    | 2. DONE CHECKING THE TOKEN THE TOKEN.          | 
    + ------------------------------------------------------------------------- + 
    |  issued_to:     ************.apps.googleusercontent.com | 
    |  audience:     ************.apps.googleusercontent.com | 
    |   user_id:            ************ | 
    |  expires_in:              3600 | 
    |   email:          **********@gmail.com | 
    | verified_email:              1 | 
    |  access_type:             offline | 
    |   scopes::               | 
    + ------------------------------------------------------------------------- + 
    | 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          | 
    + ------------------------------------------------------------------------- + 
に要求を送信することにより、「新鮮な」アクセストークンを検証しようとしました

ドライブフィードにアクセスしようとすると、応答は次のようになります。

 
    Error calling GET https://www.googleapis.com/drive/v2/files (401) Invalid Credentials 

    domain:   global 
    reason:   authError 
    message:  Invalid Credentials 
    locationType: header 
    location:  Authorization 

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

  1. トークンは以前(すべてが機能していた)有効でした。
  2. トークンをリフレッシュしても機能します。
  3. フィードを要求すると、「無効な資格情報」エラーが返されます。
  4. 他のすべてのトークンはまだ機能しており、コードは有効です。

通常、トークンが取り消されると、トークンを更新しようとすると "invalid_grant"エラーが返されます。この現象の理由ことができるもの

質問

  1. ?リフレッシュトークンが取り消されたり、何らかの方法で無効になった場合は、新しいアクセストークンの要求によってエラーが発生しますか?
  2. リフレッシュトークンを検証する方法はありますか?
  3. エラー時に、GoogleのAPIドキュメント毎
+1

私は多くの結果的な要求の後で同じ奇妙な動作を経験します。 – ageorgios

答えて

16

&エラーコード:

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

グーグルの認証トークン検証(https://www.googleapis.com/oauth2/v1/tokeninfo)クライアント多分有効な応答を返すことができますが、秘密またはクライアントIDが変更されます。

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

REST呼び出しでもクライアントlibでも、リクエストをどのようにしているのか分かりませんが、コマンドラインインターフェイスでAPI呼び出しを行うことができるruby libを使用しています。私はこの& OAuth2プレイグラウンドがGoogle APIコールの診断に非常に役立つことを発見しました。

Google APIには、「無効な資格情報」と「不十分な権限」という2つのエラーしかありません。後者はほとんど常に悪いスコープと関係していました。前者は他のすべてのものです。

6ヶ月で2つのエラーしか経験していないと、あなたは幸運です!

+1

返事をありがとう。 エラーは一致しますが、問題は、** refresh_token **が新しい** access_tokens **をフェッチできることです。これは確認することもできます。 他のユーザーと同じエラー(_401無効な資格情報_)がありましたが、違いは新しい** access_token **が要求されたときに_invalid_grant_エラーが発行されたことです。したがって、トークンが期限切れになった、または取り消されたと言うことは容易でした。 –

+1

私はgoogle Plusを使ってログインしようとすると、access_tokenを取得しましたが、そのaccess_tokenを使用すると、私はユーザー情報を取得して401エラーを出します。私の資格が間違っている場合、どうすればアクセストークンを取得できますか?私がアクセストークンを持っていれば、それはなぜ私に結果を与えないのですか?助けてください :( –

2

私は最近、この奇妙なエラーを経験しました。私の修正:私はAuthUrlにリダイレクトする前に、すべてのセッションの設定を解除する機能を追加しました。

2

GoogleのコンソールでリダイレクトURLを変更してから、サーバー上のjson資格情報ファイルを更新してみると、この問題が発生しました。私は、セッション変数をクリアしてから、新たに開始しなければならなかった。だからあなたのプロジェクトに一度だけこの操作を行います。

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

は乾燥が一度それを実行した後session_unset()を削除することを忘れないでください。

3

開発環境です。私もこの問題を抱えていた。

まず、資格情報を更新しようとしました。検索結果はありません。その後、私は自分のアプリを削除しました(私はまだ開発環境にいるので、OKですが、すでに本番環境でこれを使用している場合はこのアクションに気をつけてください)、新しいものを作成し、クライアントの資格情報JSONを更新しました。まだ、結果はありません。

Googleアカウントにログインしていない新しいブラウザインスタンス(私がFirefox上にいるため、プライベートブラウジング)を開いてGoogleアカウントに再度ログインして解決しました。 Webアプリケーションです)。私は期待どおりに承認画面にリダイレクトされ、その後、それは私のために正常に働いた。

0

特定のアプリのGoogleアカウントへのアクセスを削除したときに(401) Invalid Credentialsが届きました。だから私は、承認URL(https://accounts.google.com/o/oauth2/authで始まるURL)を再度要求する必要がありました。

0

スコープを読み取り専用からすべてのファイルの読み取りと書き込みに変更する必要があるときに、同じ問題が発生しました。だから、私は唯一の読み取りからの私のファイルの先頭にあるから、私のスコープを更新:

// If modifying these scopes, delete your previously saved credentials 
// at ~/.credentials/sheets.googleapis.com-nodejs-quickstart.json 
var SCOPES = ['https://www.googleapis.com/auth/drive']; 

Googleは、そのAPIガイドから、あなたはスコープを変更するたび、あなたは資格情報を更新しなければならないと言うこれらのコメントがあります。これは、私が確信していませんが、トークンを更新する必要があることを意味します。古いトークンはまだGoogleによって保有されており、私はRead Onlyアクセスしか持っていないと考えていたので、なぜ401エラーが返されるのでしょうか。だから、私は自分のトークンを作り直す必要があるが、Googleは決して私にすべてのファイルの読み取りと書き込みを許可するという新しい同意画面を提示したことはなかった。だから、私は再び来て、その画面を取得するために必要なので、それは古い置き換えるために新しいトークンを作成します。私はすでに保存されたトークンを持っていたので、それは決して新しいものを作成しなかった

fs.readFile(TOKEN_PATH, function(err, token) { 
    if (err) { 
     getNewToken(oauth2Client, callback); 
    } else { 
     getNewToken(oauth2Client, callback); 
    // oauth2Client.credentials = JSON.parse(token); 
    // callback(oauth2Client); 
    } 
    }); 

。だから、私はちょうど古いトークンの使用をコメントし、新しいトークンを取得するように言った。その後、私はGoogleのConnected Appsに行き、古い接続資格情報を削除しました。このステップが必要かどうかはわかりませんが、個人アカウントにアクセスしようとしています。それから私のプログラムを走らせると、私は再認証を促し、すべてが機能し、認証エラーを受け取らなかった。完了したら、すでに作成されたトークンを使用するために、コメントアウトされた行を削除してください。私はこのすべてのためにGoogle API quickstart.jsファイルを使用していました。

スコープを更新すると、古いトークンは読み取り専用スコープを使用していたため、(401)無効な資格情報が表示されます。

0

c:\ Users \ [user] \。credentialsのjsonファイルを削除したときにこの問題が解決されました。 GoogleのChromeで

0

クリアストレージは私のために働いていた('のクリアストレージ' はをクリアしているもののすべての詳細を知らない):

  1. F12はCtrl + Shiftキー+ I
  2. Applicationタブ
  3. Clear storage
0

はたぶん、この動作が原因グーグルdescribesは、次のように制限することです。

クライアントごとのユーザーアカウントあたり50個のリフレッシュトークンの制限は現在あり。制限に達すると、新しいトークンを作成すると警告なしで最も古いトークンが自動的に無効になります。この制限はサービスアカウントには適用されません。

また、すべてのクライアントでユーザーアカウントまたはサービスアカウントが持つことができるトークンの総数には、より大きな制限があります。通常のユーザーのほとんどはこの制限を超えません。ですが、開発者のテストアカウントはです。

関連する問題