2011-11-29 16 views
51

私はFacebookのログインを使ってユーザーを特定しました。新しいユーザーが来たとき、自分のユーザーIDを自分のデータベースに保存します。次回彼らが来るとき、私は自分のFacebook IDを認識し、自分のデータベースにどのユーザーがいるのか知っています。Google OAuth2ユーザーを特定するにはどうすればよいですか?

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

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

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

答えて

26

私はGoogleの-API-PHP-クライアント/ 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

+4

Googleは最近レスポンスを変更しており、 'id_token'には以前のようなキー' id'の代わりにキー 'sub'の静的識別子が含まれていることに注意してください。 AFAIKでは、この変更はOpenID Connectプロトコルの解釈です。残念ながら、私がこれを書いているように、応答は多少ランダムであるように見えます。時には 'id'と時には' sub'ですので、両方をサポートする必要があります。 –

1

"これは誰?"本質的にサービスです。あなたはスコープとしてそれへのアクセスを要求して、アイデンティティを取得するにはGoogleプロフィールリソースサーバにリクエストを行う必要があります。詳細は、OAuth 2.0 for Loginを参照してください。

+0

を参照してください。これは最も技術的に正しいように思えるが、それは現在受け入れ答えは持っている余分なディテールを欠いています。 2つの答えをまとめて、あなたは金を持っています。 –

76

他の人が述べたように、あなたはあなただけ受信したトークンのOAuth2ベアラを使用して、https://www.googleapis.com/oauth2/v3/userinfoにGETを送信することができ、あなたは(ユーザーに関するいくつかの情報を含む応答を取得します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(時間の節約)をすることなく、すぐにIDを識別できます。

コメントに記載されているとおり、これらのトークンはGoogleの秘密鍵で署名されており、Googleの公開鍵(https://www.googleapis.com/oauth2/v3/certs)を使用して署名が正当なものであることを確認してください。

JWTの内容は、https://jwt.io/に貼り付けることで確認できます(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をプログラムでデコードするライブラリもあります。

PShttps://accounts.google.com/.well-known/openid-configuration:あなたはそのURLを確認することができ、GoogleのOpenIDの接続プロバイダでサポートされているURLや機能の最新のリストまでを取得します。

+1

この情報を安全に使用するには、JWTの署名を確認する必要があります。あなたは公開鍵が必要です。 Googleが公開鍵を利用できるようにするにはどうすればよいですか? – jazmit

+7

OK、見つかりました:https://www.googleapis.com/oauth2/v1/certs また、検証を行うことが絶対に必要であることを指摘する必要があります。そうしないと、攻撃者は既に登録済みのアプリケーションを使用して簡単にアプリケーションにログインできますGoogleアカウント。 – jazmit

+0

@ jamesinchinaそして、情報そのものが攻撃者からではなくGoogleから直接送られた場合、この攻撃はどのように可能かと思いますか? – stroncium

1

Google Apps側のトークンをhttps://www.googleapis.com/oauth2/v1/tokeninfoエンドポイント経由でチェックすることで、公開鍵を使ってJWTをローカルで検証することができます(Google APIクライアントライブラリは公開鍵を自動的にダウンロードしてキャッシュします)。トークンの作成以降に取り消されました。

9

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

これで、固有のユーザーIDとして機能するのはsub属性になりました。

Google Dev OpenID Connect UserInfo

+1

これが正しいかどうかわかりません。ドキュメントの状態にかかわらず、私の認証サーバーを再起動し、キャッシュをクリアして再ログインすると、「サブ」は異なります。 – HockeyJ

+0

他の誰かがHockeyJの問題を同じサブスクリプションに変更しましたか? – dardawk

関連する問題