165

Google 認証アクセス トークンを確認するにはどうすればよいですか?

何らかの方法で Google にクエリを実行し、「[与えられたアクセス トークン] は [example@example.com] Google アカウントに対して有効ですか?」と尋ねる必要があります。

短縮版

Google Authentication Api :: OAuth Authentication for Web Applicationsを通じて提供されるアクセス トークンを使用して、さまざまな Google サービスからデータをリクエストする方法は明らかです。特定のアクセス トークンが特定の Google アカウントに対して有効かどうかを確認する方法が明確ではありません。方法を知りたいです。

ロングバージョン

トークンベースの認証を使用する API を開発しています。有効なユーザー名とパスワードが提供されるか、 N 個の検証可能なサービスのいずれかからサードパーティのトークンが提供されると、トークンが返されます。

サードパーティ サービスの 1 つが Google であり、ユーザーは Google アカウントを使用して私のサービスに対して認証を行うことができます。これは、後で Yahoo アカウント、信頼できる OpenID プロバイダーなどを含むように拡張されます。

Google ベースのアクセスの概略例:

代替テキスト

「API」エンティティは私の完全な管理下にあります。「パブリック インターフェイス」エンティティは、Web ベースまたはデスクトップ ベースのアプリです。一部の公開インターフェースは私の管理下にあり、他のものは制御できず、まだ私が知ることさえないものもあります。

したがって、ステップ 3 で API に提供されたトークンを信頼できません。これは、対応する Google アカウントのメール アドレスと共に提供されます。

どうにかして Google にクエリを実行し、「このアクセス トークンは example@example.com に対して有効ですか? 」と尋ねる必要があります。

この場合、example@example.com は Google アカウントの一意の識別子であり、ユーザーが Google アカウントにログインするために使用するメール アドレスです。これを Gmail アドレスと見なすことはできません。Gmail アカウントを持っていなくても Google アカウントを持つことができます。

Google のドキュメントには、アクセス トークンを使用して、さまざまな Google サービスからデータを取得する方法が明確に記載されています。そもそも、特定のアクセストークンが有効かどうかを確認する方法については何も述べていないようです。

更新 トークンは N 個の Google サービスに対して有効です。特定のユーザーが実際に使用しているすべての Google のサービスのサブセットがわからないため、検証の手段として Google サービスに対してトークンを試すことはできません。

さらに、Google 認証アクセス トークンを使用して Google サービスにアクセスすることは決してありません。単に、想定される Google ユーザーが実際に本人であることを確認する手段としてだけです。これを行う別の方法があれば、喜んで試します。

4

12 に答える 12

67

わかりました、ほとんどの答えは有効ですが、まったく正しくありません。JWT の考え方は、毎回発行者に連絡する必要なく、トークンを検証できるということです。ID を確認し、Google がトークンの署名に使用した証明書の既知の公開鍵を使用して、トークンの署名を検証する必要があります。

その理由と方法については、次の記事を参照してください。

http://ncona.com/2015/02/using-a-google-id-token-from-a-server/

于 2016-08-02T11:20:52.863 に答える
40

このエンドポイントを使用して、Google 認証アクセス トークンを検証できます。

https://www.googleapis.com/oauth2/v3/tokeninfo?access_token=<access_token>

これは Google V3 OAuth AccessToken 検証エンドポイントです。以下の Google ドキュメントから参照できます: (OAUTH 2.0 ENDPOINTSタブ内)

https://developers.google.com/identity/protocols/OAuth2UserAgent#validate-access-token

于 2017-05-26T02:21:57.030 に答える
19
function authenticate_google_OAuthtoken($user_id)
{
    $access_token   = google_get_user_token($user_id); // get existing token from DB
    $redirecturl    = $Google_Permissions->redirecturl;
    $client_id      = $Google_Permissions->client_id;
    $client_secret  = $Google_Permissions->client_secret;
    $redirect_uri   = $Google_Permissions->redirect_uri;
    $max_results    = $Google_Permissions->max_results;

    $url = 'https://www.googleapis.com/oauth2/v1/tokeninfo?access_token='.$access_token;
    $response_contacts  =  curl_get_responce_contents($url);
    $response   =   (json_decode($response_contacts));

    if(isset($response->issued_to))
    {
        return true;
    }
    else if(isset($response->error))
    {
        return false;
    }
}
于 2012-05-08T12:35:22.083 に答える
10

Google oauth コード フローの応答に加えて、暗号化された形式の検証情報に役立つ情報がaccess_token返されます。id_token

ID トークンが便利な理由の 1 つは、アプリのさまざまなコンポーネント間で ID トークンを渡すことができることです。これらのコンポーネントは、アプリとユーザーを認証する軽量の認証メカニズムとして ID トークンを使用できます。ただし、ID トークン内の情報を使用したり、ユーザーが認証されたというアサーションとして信頼したりする前に、その情報を検証する必要があります。

ID トークンの検証には、いくつかの手順が必要です。

  • ID トークンが、適切な Google 公開鍵で適切に署名された JWT であることを確認します。
  • ID トークンの aud の値がアプリのクライアント ID と同じであることを確認します。
  • ID トークンの iss の値が accounts.google.com またはhttps://accounts.google.comと等しいことを確認します。
  • ID トークンの有効期限 (exp) が経過していないことを確認します。
  • リクエストで hd パラメータを渡した場合は、ID トークンに、Google Apps がホストするドメインと一致する hd クレームがあることを確認してください。

https://developers.google.com/identity/protocols/OpenIDConnect#validatinganidtokenリンクには、ID トークンを検証するためのコード サンプルがあります。

https://security.stackexchange.com/questions/37818/why-use-openid-connect-instead-of-plain-oauthも参照してください。

于 2015-07-23T20:03:38.757 に答える
3
  1. Google のドキュメントに従って、Google の AP クライアント ライブラリを使用する必要があります。これにより、独自のカスタム コードを記述するよりも、これ (トークンの検証、クレームの抽出など) がはるかに簡単になります。

  2. パフォーマンスの観点から、Google を再度呼び出すことなくトークンをローカルで解析する必要があります。もちろん、Google の公開鍵が必要であり、その鍵の取得は、上記の #1 から Google のクライアント ライブラリに実装されたキャッシュ戦略を使用して行われます。

  3. 参考までに。Google も JWT トークンを使用します。参考までに下の画像をご覧ください。

ここに画像の説明を入力

于 2020-10-17T02:36:37.213 に答える
1

どうにかして Google にクエリを実行し、「このアクセス トークンは example@example.com に対して有効ですか?」と尋ねる必要があります。

いいえ。必要なのは、API ドメインからGoogle アカウント ユーザーの Federated Login を使用して標準ログインをリクエストすることだけです。その後、「永続的なユーザー ID」を「パブリック インターフェイス」から取得したものと比較できます。

realm の値は、Google フェデレーション ログイン ページで使用され、ユーザーが要求しているサイトを識別します。また、Google から返される永続的なユーザー ID の値を決定するためにも使用されます。

したがって、「パブリック インターフェイス」と同じドメインに属している必要があります。

また、ユーザーは API が信頼できることを確認する必要があることを忘れないでください ;) そのため、Google はユーザーに身元を確認できるかどうかを尋ねます。

于 2009-01-12T01:59:34.603 に答える
0

https://www.google.com/accounts/AuthSubTokenInfoへのトークンを使用して、OAuth で認証されたリクエストを作成してみてください。これは AuthSub でのみ機能することが文書化されていますが、OAuth でも機能します。トークンがどのユーザー向けであるかはわかりませんが、有効なサービスはわかります。トークンが無効であるか取り消されている場合、リクエストは失敗します。

于 2009-02-26T06:51:51.513 に答える
0

トークンの意味は OAuth Core 仕様の範囲外であるため、任意の OAuth アクセス トークンを認証に使用することはできません。1 回の使用または短い有効期限ウィンドウを対象とする場合もあれば、ユーザーが許可したくないアクセスを提供する場合もあります。また、これは不透明であり、それを取得した OAuth コンシューマーは、ユーザー ID のタイプを見たことがない可能性があります。

OAuth サービス プロバイダーと 1 人または複数のコンシューマーは、OAuth を使用して検証可能な認証トークンを簡単に提供できます。これを行うための提案やアイデアは出回っていますが、OAuth コアのみを話す任意のサービス プロバイダーは、他の共同作業なしではこれを提供できません。消費者との調整。Google 固有の AuthSubTokenInfo REST メソッドは、ユーザーの識別子とともに近いですが、トークンを無効にしたり、トークンの有効期限が切れたりする可能性があるため、適切ではありません。

Google ID が OpenId 識別子であり、「パブリック インターフェイス」が Web アプリであるか、ユーザーのブラウザを呼び出すことができる場合は、おそらく Google の OpenID OP を使用する必要があります。

OpenID は、ユーザーを OP に送信し、署名されたアサーションを取得するだけで構成されます。インタラクションは、RP の利益のためだけのものです。RP が OP でユーザーを正常に認証したことを示すために使用できる、長寿命のトークンやその他のユーザー固有のハンドルはありません。

OpenID 識別子に対して以前の認証を検証する 1 つの方法は、同じユーザー エージェントが使用されていると仮定して、認証を再度実行することです。OP は、ユーザーの操作なしで肯定的なアサーションを返すことができる必要があります (たとえば、Cookie またはクライアント証明書を検証することによって)。OP は別のユーザーの操作を自由に要求できます。また、認証要求が別のドメインからのものである場合は、おそらくそうするでしょう (私の OP は、将来対話せずにこの特定の RP を再認証するオプションを提供します)。また、Google の場合、ユーザーが OAuth トークンを取得するために使用した UI が同じセッション ID を使用していない可能性があるため、ユーザーは再認証する必要があります。しかし、いずれにせよ、ID を主張することができます。

于 2009-08-28T23:45:18.707 に答える