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


134

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

どういうわけかGoogleにクエリを実行して質問する必要があります:[与えられたアクセストークン]は[example@example.com] Googleアカウントに対して有効ですか?

短いバージョンGoogle認証API
を介して提供されるアクセストークンがどのように使用できるかは明らかです。特定のアクセストークンが特定のGoogleアカウントに対して有効かどうかを確認する方法は明確ではありません。方法を教えてください。

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

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

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

代替テキストhttp://webignition.net/images/figures/auth_figure002.png

「API」エンティティは私の完全な管理下にあります。「公開インターフェース」エンティティは、ウェブベースまたはデスクトップベースのアプリです。一部のパブリックインターフェイスは私の制御下にあり、他のインターフェイスはそうではなく、他のインターフェイスはまだ私が知ることすらありません。

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

どういうわけかGoogleにクエリを実行して質問する必要があります:このアクセストークンはexample@example.comに対して有効ですか?

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

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

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

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


この質問について特定の認証サービスは何ですか(OAuth、AuthSub、インストール済みアプリなど)?より詳細なリンクを提供してください。
Martin v。Löwis、2008

@Martin v。Löwis:「WebアプリケーションのOAuth認証」サービス-これを反映するように質問の冒頭を更新しました。これを指摘してくれてありがとう!
Jon Cram

グーグルキー検証に関する興味深い記事は、より多くの洞察を与えるかもしれませんgroups.google.com/group/Google-Maps-API/msg/f9e3c5ad3cbda4d7
dotjoe 2008

回答:


138

ユーザーチェックの場合、アクセストークンをaccessTokenとして取得して投稿し、応答を取得するだけです

https://www.googleapis.com/oauth2/v1/tokeninfo?access_token=accessToken

あなたもブラウザのアドレスバーで試すことができ、Javaでもhttppostと応答を使用します

応答は次のようになります

{
     "issued_to": "xxxxxxxxxxxxx-xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx.apps.googleusercontent.com",
     "audience": "xxxxxxxxxxxxxxx-xxxxxxxxxxxxxxxxxxxxxxxxxx.apps.googleusercontent.com",
     "user_id": "xxxxxxxxxxxxxxxxxxxxxxx",
     "scope": "https://www.googleapis.com/auth/userinfo.profile https://gdata.youtube.com",
     "expires_in": 3340,
     "access_type": "offline"
    }

スコープは、accessTokenに与えられた許可です。このリンクでスコープIDを確認できます

更新: 以下の新しいAPI投稿

https://oauth2.googleapis.com/tokeninfo?id_token=XYZ123

応答は次のようになります

 {
 // These six fields are included in all Google ID Tokens.
 "iss": "https://accounts.google.com",
 "sub": "110169484474386276334",
 "azp": "1008719970978-hb24n2dstb40o45d4feuo2ukqmcc6381.apps.googleusercontent.com",
 "aud": "1008719970978-hb24n2dstb40o45d4feuo2ukqmcc6381.apps.googleusercontent.com",
 "iat": "1433978353",
 "exp": "1433981953",

 // These seven fields are only included when the user has granted the "profile" and
 // "email" OAuth scopes to the application.
 "email": "testuser@gmail.com",
 "email_verified": "true",
 "name" : "Test User",
 "picture": "https://lh4.googleusercontent.com/-kYgzyAWpZzJ/ABCDEFGHI/AAAJKLMNOP/tIXL9Ir44LE/s99-c/photo.jpg",
 "given_name": "Test",
 "family_name": "User",
 "locale": "en"
}

詳細については、https://developers.google.com/identity/sign-in/android/backend-auth


11
Googleのoauth2-v3の新しいバージョンがあります。ここでの例を参照してください:developers.google.com/identity/sign-in/android/backend-auth
AlikElzin-kilaka

30

このエンドポイントを使用して、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


バックエンドドキュメントの場合-ドキュメントのソースはこちら
eton_ceb '22年

26

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

理由とその方法については、次の投稿をご覧ください。

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


3
もっと投票してください!The idea of JWT is that you can validate the token without the need to contact the issuer everytime.
Moritz Schmitz対Hülst19年

はい!pplは、トークン情報のためにgoogleを呼び出すだけの場合、ddos-ing googleです
datdinhquoc

GoogleアクセストークンはJWTではないため、これを行うことはできません。stackoverflow.com/questions/48623656/…を
DanielJaramillo

18
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;
    }
}

2
この答えはほとんど有効です。Issued_toはもう設定されていないようです。developers.google.com/accounts/docs/...
frostymarvelous

6

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トークンを検証するためのコードサンプルがあります。

/security/37818/why-use-openid-connect-instead-of-plain-oauthも参照してください


1

どういうわけかGoogleにクエリを実行して、このアクセストークンはexample@example.comに対して有効ですか?

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

レルムの値は、ユーザーに対してリクエストしているサイトを識別するために、Google統合ログインページで使用されます。また、Googleから返される永続的なユーザーIDの値を決定するためにも使用されます。

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

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


1

Guzzleの使用例を次に示します。

/**
 * @param string $accessToken JSON-encoded access token as returned by \Google_Client->getAccessToken() or raw access token
 * @return array|false False if token is invalid or array in the form
 * 
 * array (
 *   'issued_to' => 'xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx.apps.googleusercontent.com',
 *   'audience' => 'xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx.apps.googleusercontent.com',
 *   'scope' => 'https://www.googleapis.com/auth/calendar',
 *   'expires_in' => 3350,
 *   'access_type' => 'offline',
 * )
 */
public static function tokenInfo($accessToken) {
    if(!strlen($accessToken)) {
        return false;
    }

    if($accessToken[0] === '{') {
        $accessToken = json_decode($accessToken)->access_token;
    }

    $guzzle = new \GuzzleHttp\Client();

    try {
        $resp = $guzzle->get('https://www.googleapis.com/oauth2/v1/tokeninfo', [
            'query' => ['access_token' => $accessToken],
        ]);
    } catch(ClientException $ex) {
        return false;
    }

    return $resp->json();
}

0

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


0

トークンの意味はOAuthコア仕様の範囲外であるため、任意の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は同じセッション識別子を使用しない可能性があるため、ユーザーは再認証する必要があります。しかし、いずれにせよ、あなたはアイデンティティを主張することができます。


OpenID 2.0は、検証可能なIDトークンを提供するOAuthベースのOpenID Connectの採用により、Googleによって非推奨となり、無効にされました。
Vadzim 2015
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.