web-dev-qa-db-ja.com

Google OAuth2ユーザーを識別する方法は?

Facebookログインを使用してユーザーを識別しました。新しいユーザーが来たら、そのユーザーIDをデータベースに保存します。次回彼らが来るとき、私は彼らのFacebook IDを認識し、それが私のデータベースにあるユーザーを知っています。

GoogleのOAuth2でも同じことをしようとしていますが、ユーザーをどのように認識できますか?

Googleからいくつかのコードとトークン(access_token、id_token、refresh_token)が送信されますが、それらはどれも一定ではありません。つまり、2分後にログアウトして再度ログインすると、3つの値がすべて変更されます。ユーザーを一意に識別するにはどうすればよいですか?

私は彼らのPHPクライアントライブラリ: https://code.google.com/p/google-api-php-client/ を使用しています

56
Nathan H

このメソッドをgoogle-api-php-client/src/apiClient.phpに挿入しました:

public function getUserInfo() 
{
    $req = new apiHttpRequest('https://www.googleapis.com/oauth2/v1/userinfo');
    // XXX error handling missing, this is just a rough draft
    $req = $this->auth->sign($req);
    $resp = $this->io->makeRequest($req)->getResponseBody();
    return json_decode($resp, 1);  
}

今、私は電話することができます:

$client->setAccessToken($_SESSION[ 'token' ]);
$userinfo = $client->getUserInfo();

次のような配列を返します(そのスコープが要求されている場合は電子メールも加えます):

Array
(
    [id] => 1045636599999999999
    [name] => Tim Strehle
    [given_name] => Tim
    [family_name] => Strehle
    [locale] => de
)

ソリューションはこのスレッドから始まりました: https://groups.google.com/forum/#!msg/google-api-php-client/o1BRsQ9NvUQ/xa532MxegFIJ

26
Tim Strehle

他の人が言及したように、あなたは https://www.googleapis.com/oauth2/v3/userinfo にGETを送信し、受け取ったOAuth2ベアラートークンを使用して、ユーザーに関する情報(ID、名前など)。

また、Googleが OpenID Connect を実装しており、このユーザー情報エンドポイントはその一部にすぎないことにも言及する価値があります。

OpenID Connect は、OAuth2上の認証レイヤーです。 Googleのトークンエンドポイントで認証codeを交換すると、アクセストークン(access_tokenパラメーター)とOpenID Connect IDトークン(id_tokenパラメーター)を取得します。

これらのトークンは両方とも[〜#〜] jwt [〜#〜](JSON Web Token、 http://tools.ietf。 org/html/draft-ietf-oauth-json-web-token )。

それらをデコードすると、ユーザーのidを含むいくつかのアサーションが取得されます。このIDをDB内のユーザーにリンクすると、余分なuserinfo GETを実行しなくてもすぐにそれらを識別できます(時間を節約できます)。

コメントで述べたように、これらのトークンはGoogleの秘密キーで署名されているため、Googleの公開キーを使用して署名を検証することができます( https://www.googleapis.com/oauth2/v3/certs )それらが本物であることを確認します。

https://jwt.io/ (JWTデバッガーでスクロールダウン)に貼り付けると、JWTの内容を確認できます。アサーションは次のようになります。

{
    "iss":"accounts.google.com",
    "id":"1625346125341653",
    "cid":"8932346534566-hoaf42fgdfgie1lm5nnl5675g7f167ovk8.apps.googleusercontent.com",
    "aud":"8932346534566-hoaf42fgdfgie1lm5nnl5675g7f167ovk8.apps.googleusercontent.com",
    "token_hash":"WQfLjdG1mDJHgJutmkjhKDCdA",
    "iat":1567923785,
    "exp":1350926995
}

JWTをプログラムでデコードするためのさまざまなプログラミング言語用のライブラリもあります。

[〜#〜] ps [〜#〜]:GoogleのOpenID ConnectプロバイダーでサポートされているURLと機能の最新リストを取得するには、チェックできます。そのURL: https://accounts.google.com/.well-known/openid-configuration

85
Christophe L

OpenID Connect APIはid属性を返さないことに注意してください。

これは、一意のユーザーIDとして機能するsub属性です。

Google Dev OpenID Connect UserInfo を参照してください

13
blang

"これは誰ですか?"基本的にサービスです。 scopeとしてアクセスを要求してから、GoogleプロファイルリソースサーバーIDを取得します。詳細については、 OAuth 2.0 for Login をご覧ください。

1
Ryan Culpepper

JWTは公開鍵でローカルに検証できます(Google APIクライアントライブラリは公開鍵を自動的にダウンロードしてキャッシュします) https://www.googleapis.com/oauth2/v1/ tokeninfo エンドポイントは、トークンの作成後にアプリケーションへのアクセスが取り消されたかどうかを確認するために必要です。

1
Orange

Javaバージョン

OAuth2Sample.Java

0
honzajde