Google認証アクセストークンを確認するにはどうすればよいですか?
何らかの方法でGoogleにクエリを実行し、質問する必要があります:[与えられたアクセストークン]は[[email protected]] Googleアカウントに対して有効ですか?
ショートバージョン:
Google Authentication Api :: OAuth Authentication for Web Applications から提供されるアクセストークンを使用して、 Googleサービスの範囲。特定のアクセストークンが特定のGoogleアカウントで有効かどうかを確認する方法は明確ではありません。方法を知りたいです。
ロングバージョン:
トークンベースの認証を使用するAPIを開発しています。トークンは、有効なユーザー名とパスワードの提供時、または次のいずれかからのサードパーティトークンの提供時に返されます。 N 検証可能なサービス。
サードパーティサービスの1つはGoogleであり、ユーザーは自分のGoogleアカウントを使用して私のサービスに対して認証することができます。これは後に拡張され、Yahooアカウント、信頼できるOpenIDプロバイダーなどが含まれます。
Googleベースのアクセスの模式的な例:
alt text http://webignition.net/images/figures/auth_figure002.png
「API」エンティティは完全に管理されています。 「パブリックインターフェイス」エンティティは、Webベースまたはデスクトップベースのアプリです。いくつかの公開インターフェースは私の制御下にあり、他のインターフェースはそうではなく、他のインターフェースはまだ私も知らないかもしれません。
したがって、手順3でAPIに提供されたトークンを信頼できません。これは、対応するGoogleアカウントのメールアドレスとともに提供されます。
私は何らかの形でGoogleに問い合わせて、尋ねる必要があります:このアクセストークンは[email protected]に有効ですか?
この場合、example @ example.comはGoogleアカウントの一意の識別子です。誰かがGoogleアカウントへのログインに使用するメールアドレスです。これはGmailアドレスであると想定することはできません-誰かがGmailアカウントを持っていなくてもGoogleアカウントを持つことができます。
Googleのドキュメントには、アクセストークンを使用して、多くのGoogleサービスからデータを取得する方法が明確に記載されています。与えられたアクセストークンがそもそも有効であるかどうかを確認する方法については何も述べていないようです。
UpdateトークンはN個のGoogleサービスで有効です。特定のユーザーが実際に使用しているすべてのGoogleサービスのサブセットがわからないため、トークンを検証する手段としてGoogleサービスに対してトークンを試すことはできません。
さらに、Google認証アクセストークンを使用してGoogleサービスにアクセスすることはありません。単に、想定されるGoogleユーザーが実際に本人であることを確認する手段としてです。これを行う別の方法がある場合、私は試して満足です。
ユーザーチェックの場合は、accessTokenとしてアクセストークンを取得して投稿し、それを投稿して応答を取得するだけです。
https://www.googleapis.com/oauth2/v1/tokeninfo?access_token=accessToken
ブラウザのアドレスバーでも試すことができます。httppostと応答をJavaも使用してください
応答は次のようになります
{
"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の与えられた許可です。 this link でスコープIDを確認できます
次のエンドポイントを使用して、Google認証アクセストークンを確認できます。
https://www.googleapis.com/oauth2/v3/tokeninfo?access_token=<access_token>
これはGoogle V3ですOAuth AccessToken検証エンドポイント、以下のGoogleドキュメントから参照できます:(In OAUTH 2.0 ENDPOINTS
Tab)
https://developers.google.com/identity/protocols/OAuth2UserAgent#validate-access-token
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;
}
}
わかりました、ほとんどの答えは有効ですが、まったく正しくありません。 JWTの考え方は、発行者に毎回連絡する必要なしにトークンを検証できるということです。 IDを確認し、トークンの署名に使用されたGoogleの証明書の既知の公開キーでトークンの署名を確認する必要があります。
次の投稿でこれを行う理由と方法を参照してください。
http://ncona.com/2015/02/consuming-a-google-id-token-from-a-server/
Google oauth code flow responseaccess_token
に加えて、暗号化された形式の検証情報に役立つid_token
も返します。
IDトークンを便利にするものの1つは、アプリのさまざまなコンポーネントにIDトークンを渡すことができるという事実です。これらのコンポーネントは、アプリとユーザーを認証する軽量の認証メカニズムとしてIDトークンを使用できます。ただし、IDトークンの情報を使用したり、ユーザーが認証したことをアサーションとして使用したりする前に、検証する必要があります。
IDトークンの検証には、いくつかの手順が必要です。
https://developers.google.com/identity/protocols/OpenIDConnect#validatinganidtoken リンクには、IDトークンの検証用のコードサンプルがあります。
https://security.stackexchange.com/questions/37818/why-use-openid-connect-instead-of-plain-oauth も参照してください。
Googleに何らかの方法でクエリを実行して、このアクセストークンは[email protected]に対して有効ですか?
いいえ。必要なのは、APIドメインから Googleアカウントユーザーの統合ログイン で標準ログインをリクエストすることだけです。そしてその後のみ、「永続的なユーザーID」を「パブリックインターフェース」から取得したIDと比較できます。
レルムの値は、Googleフェデレーションログインページで使用され、ユーザーに対してリクエスト元のサイトを識別します。また、Googleから返される永続的なユーザーIDの値を決定するためにも使用されます。
したがって、「パブリックインターフェース」と同じドメインにいる必要があります。
また、ユーザーがAPIを信頼できることを確認する必要があることを忘れないでください。
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();
}
トークンの意味がOAuth Core仕様の外にあるため、任意のOAuthアクセストークンは認証に使用できません。単一の使用または狭い有効期限ウィンドウ、またはユーザーが与えたくないアクセスを提供できます。また、不透明であり、それを取得したOAuthコンシューマーは、ユーザー識別子。
OAuthサービスプロバイダーと1人以上の消費者は、検証可能な認証トークンを提供するためにOAuthを簡単に使用できます。ただし、OAuth Coreは、消費者とのその他の調整なしではこれを提供できません。Google固有のAuthSubTokenInfo RESTメソッド、ユーザーの識別子で、近いですが、トークンを無効にしたり、トークンが期限切れになる可能性があるため、適切ではありません。
Google IDがOpenId識別子であり、「パブリックインターフェイス」がWebアプリであるか、ユーザーのブラウザーを呼び出すことができる場合は、おそらくGoogleのOpenID OPを使用する必要があります。
OpenIDは、ユーザーをOPに送信し、署名されたアサーションを取得するだけで構成されています。相互作用は、RPの利益のためだけです。 RPがOPを使用してユーザーを正常に認証したことを示すために使用できる、長期間有効なトークンやユーザー固有のハンドルはありません。
OpenID識別子に対して以前の認証を検証する1つの方法は、同じユーザーエージェントが使用されていると仮定して、再度認証を実行することです。 OPは、ユーザーの操作なしで肯定的なアサーションを返すことができる必要があります(たとえば、Cookieやクライアント証明書を検証することによって)。 OPは別のユーザーインタラクションを自由に必要とし、おそらく認証要求が別のドメインから来ている場合はそうなります(将来、インタラクションせずにこの特定のRPを再認証するオプションを提供します)。また、Googleの場合、ユーザーがOAuthトークンを取得するために通過したUIは同じセッション識別子を使用しない可能性があるため、ユーザーは再認証する必要があります。 'IDをアサートできます。
https://www.google.com/accounts/AuthSubTokenInfo へのトークンを使用して、OAuth認証リクエストを作成してみてください。これはAuthSubでのみ動作するように文書化されていますが、OAuthでも動作します。トークンがどのユーザーに使用されているかはわかりませんが、有効なサービスは表示されます。トークンが無効であるか、取り消されている場合、リクエストは失敗します。