web-dev-qa-db-ja.com

OAuth2.0トークンの奇妙な動作(無効な資格情報401)

通常、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.トークンの確認を完了しました。 | 
 + ------------------------------------------- ------------------------------ + 
 | issue_to:************。apps.googleusercontent.com | 
 |オーディエンス:************。apps.googleusercontent.com | 
 | user_id:************ | 
 | expires_in: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. 更新トークンを検証する方法はありますか?
36
Darth Flipman

エラーとエラーコードに関する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リクエストは、実際に問題を診断するのに明らかに役に立たないエラーを返す可能性があります。いくつかの理由で「Invalid Credentials」エラーが発生しました。たいていの場合、私は重要ではないと思った何らかの変更を加えましたが、実際にはそうです。

私の最初の考え(ここでは暗闇で撮影)は、Google APIコンソールに行くことです:

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

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

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

REST呼び出しまたはクライアントlibによるリクエストの作成方法はわかりませんが、コマンドラインインターフェイスを許可するRuby libを使用しますAPI呼び出しを行うために、私はこれとOAuth2 PlaygroundがGoogle API呼び出しの診断に非常に役立つことを発見しました。

参考までに、Google APIからは、「無効な認証情報」と「権限が不十分」の2つのエラーしか取得していません。後者はほとんどの場合、悪いスコープに関係していました。前者は、ほぼすべてのものです。

また、6か月間に2つのエラーしか経験していない場合は、幸運です!

20
Paul Dacus

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

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

session_unset()は、ドライドライを1回実行した後に削除することを忘れないでください。

7

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

まず、資格情報を更新してみました。検索結果はありません。その後、アプリを削除しました(まだ開発環境にいるので大丈夫ですが、既に本番環境でこれを使用している場合はこのアクションに注意してください)。新しいアプリを作成し、クライアントの資格情報JSONを更新しました。それでも、結果はありません。

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

3
priki

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

2

たぶんこの動作は、Google describes の制限によるものです。

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

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

2
ninsky

googleのストレージを消去するChrome=私のために働いた(「ストレージの消去」が消去する内容のすべての詳細を知らない):

  1. F12 (Ctrl+Shift+I
  2. Applicationタブ
  3. Clear storage
2
Joe GI

私はこのエラーで同じ問題を抱えていました:

The redirect URI in the request, does not match the ones authorized for the OAuth client.

しかし、ここでabhishek77inによってこの非常に簡単な解決策を見つけました。

https://coderwall.com/p/fmr5ag/avoid-invalid-credentials-with-google-oauth2

解決策は次のとおりです。

https://github.com/zquestz/omniauth-google-oauth2 を使用している場合は、必ずREADMEのメモに従ってください。 「Google APIコンソールから「Contacts API」と「Google+ API」を有効にする必要があります。

Google APIコンソールでこれらを有効にすると、「資格情報が無効です」という問題が修正されました。

1
Matt Shirk

特定のアプリのGoogleアカウントへのアクセスを削除すると、(401) Invalid Credentialsを受け取りました。それで、私がしなければならなかったことは、再び許可URL(https://accounts.google.com/o/oauth2/authで始まるもの)を要求することでした。

0
iloo

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

0
raphavini

userInfo: Invalid Credentials私がアクセスしようとしたスコープ配列要素、つまりgoogle + apiスコープページからリンクを取得したプロファイルとメール:何らかの理由でfalse /無効になるようになったため、以下のエラーが表示されましたGoogle APIのスコープが言及されていましたメールプロファイルopenIDそれぞれにカーソルを合わせると、古いURLをこれらのURLに置き換えてエラーを解決しました

0
Shubham Kakkar

スコープを読み取り専用からすべてのファイルの読み取りと書き込みに変更する必要があるときに、この同じ問題に遭遇しました。そこで、ファイルの先頭にあるスコープを読み取り専用から次のように更新しました。

// 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によって保持されており、読み取り専用アクセスしか持っていないと考えていたため、なぜ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の接続アプリケーションにアクセスし、古い接続資格情報を削除しました。この手順が必要かどうかはわかりませんが、個人アカウントにアクセスしようとしています。その後、プログラムを実行すると、再認証が求められ、すべてが機能し、認証エラーは表示されませんでした。完了したら、作成済みのトークンを使用するためにコメントアウトされた行を必ず削除してください。このすべてにGoogle API quickstart.jsファイルを使用していました。

そのため、スコープを更新したときに、古いトークンはまだ読み取り専用スコープを使用していたため、(401)Invalid Credentialsを取得しました。

0
Daniel Jones