Google 인증 API 액세스 토큰을 확인하려면 어떻게합니까?


134

Google 인증 액세스 토큰을 확인하려면 어떻게합니까?

어떻게 든 Google에 쿼리하고 다음을 질문해야합니다. [given access token]은 [example@example.com] Google 계정에 유효합니까?

간단한 버전 : 웹 애플리케이션 용 Google 인증 API :: OAuth 인증을
통해 제공되는 액세스 토큰을 사용하여 다양한 Google 서비스에서 데이터를 요청 하는 방법이 분명합니다 . 주어진 액세스 토큰이 주어진 Google 계정에 유효한지 확인하는 방법은 명확하지 않습니다. 방법을 알고 싶습니다.

Long version :
토큰 기반 인증을 사용하는 API를 개발 중입니다. 유효한 사용자 이름 + 비밀번호를 제공하거나 N 개의 검증 가능한 서비스 중 하나에서 제 3 자 토큰을 제공하면 토큰이 반환됩니다 .

타사 서비스 중 하나는 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, Installed Apps 등)는 무엇입니까? 더 자세한 링크를 제공하십시오.
— Martin v. Löwis 08.

@Martin v. Löwis : '웹 애플리케이션 용 OAuth 인증'서비스-이를 반영하기 위해 질문의 시작을 업데이트했습니다. 이것을 지적 해 주셔서 감사합니다!
— Jon Cram

더 통찰력을 줄 수도 키 확인을 구글에 대한 흥미로운 기사 groups.google.com/group/Google-Maps-API/msg/f9e3c5ad3cbda4d7을
— dotjoe

답변:


138

사용자 확인을 위해 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의 주어진 권한입니다. 이 링크 에서 범위 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

26

대부분의 답변은 유효하지만 옳지 않습니다. JWT의 아이디어는 매번 발행자에게 연락 할 필요없이 토큰의 유효성을 검사 할 수 있다는 것입니다. 토큰을 서명하는 데 사용 된 인증서 google의 알려진 공개 키로 ID를 확인하고 토큰의 서명을 확인해야합니다.

그 이유와 방법은 다음 게시물을 참조하십시오.

http://ncona.com/2015/02/ consumer-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 v. Hülst

예! ppl은 Google이 토큰 정보를
— 얻기

JWT가 아니기 때문에 Google 액세스 토큰으로는이 작업을 수행 할 수 없습니다. 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 2014

6

Google oauth 코드 흐름 응답 외에도 암호화 된 형식의 유효성 검사 정보에 ​​유용한 access_token반환 값 id_token도 있습니다.

ID 토큰을 유용하게 만드는 한 가지 점은 앱의 다른 구성 요소를 통해 전달할 수 있다는 것입니다. 이러한 구성 요소는 앱과 사용자를 인증하는 간단한 인증 메커니즘으로 ID 토큰을 사용할 수 있습니다. 그러나 ID 토큰의 정보를 사용하거나 사용자가 인증 한 주장으로 신뢰하기 전에 유효성을 검증해야합니다.

ID 토큰의 유효성 검사에는 몇 가지 단계가 필요합니다.

  • ID 토큰이 적절한 Google 공개 키로 올바르게 서명 된 JWT인지 확인하십시오.
  • ID 토큰의 aud 값이 앱의 클라이언트 ID와 같은지 확인하십시오.
  • ID 토큰의 is 값이 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"와 '공용 인터페이스'의 사용자 ID를 비교할 수 있습니다.

영역 값은 Google Federated Login 페이지에서 사용자에게 요청 사이트를 식별하는 데 사용됩니다. 또한 Google에서 반환 한 영구 사용자 ID의 값을 결정하는 데 사용됩니다.

따라서 '공개 인터페이스'와 동일한 도메인에 있어야합니다.

또한 사용자가 API를 신뢰할 수 있는지 확인해야합니다.) 따라서 Google은 사용자의 신원을 확인할 수 있는지 묻습니다.


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 Core 사양을 벗어나므로 임의의 OAuth 액세스 토큰을 인증에 사용할 수 없습니다. 단일 사용 또는 좁은 만료 기간을 위해 사용되거나 사용자가 원하지 않는 액세스를 제공 할 수 있습니다. 또한 불투명하며이를 얻은 OAuth 소비자는 어떤 유형의 사용자 식별자도 보지 못했을 것입니다.

OAuth 서비스 제공 업체와 한 명 이상의 소비자가 OAuth를 사용하여 검증 가능한 인증 토큰을 제공 할 수 있으며,이를 제안하기위한 제안과 아이디어가 있지만 OAuth Core 만 말하는 임의의 서비스 제공 업체는 다른 파트너 없이는이를 제공 할 수 없습니다. 소비자와의 안수. Google의 특정 AuthSubTokenInfo REST 메소드는 사용자의 식별자와 비슷하지만 토큰을 무효화하거나 토큰이 만료 될 수 있으므로 적합하지 않습니다.

Google ID가 OpenId 식별자이고 '공개 인터페이스'가 웹앱이거나 사용자의 브라우저를 호출 할 수있는 경우 Google의 OpenID OP를 사용해야합니다.

OpenID는 사용자를 OP로 보내고 서명 된 어설 션을 다시받는 것으로 구성됩니다. 상호 작용은 전적으로 RP의 이익을위한 것입니다. RP가 OP로 사용자를 성공적으로 인증했음을 나타내는 데 사용할 수있는 수명이 긴 토큰 또는 기타 사용자 별 핸들은 없습니다.

OpenID 식별자에 대해 이전 인증을 확인하는 한 가지 방법은 동일한 사용자 에이전트를 사용한다고 가정하고 인증을 다시 수행하는 것입니다. OP는 사용자 상호 작용없이 쿠키 또는 클라이언트 인증서를 확인하여 긍정적 인 주장을 반환 할 수 있어야합니다. OP는 다른 사용자 상호 작용이 필요하며 다른 도메인에서 인증 요청이 오는 경우 (내 OP는 나중에 상호 작용하지 않고이 특정 RP를 다시 인증 할 수있는 옵션을 제공합니다). 그리고 Google의 경우 사용자가 OAuth 토큰을 얻기 위해 겪은 UI가 동일한 세션 식별자를 사용하지 않을 수 있으므로 사용자는 다시 인증해야합니다. 그러나 어쨌든 정체성을 주장 할 수 있습니다.


OpenID 2.0은 확인 가능한 ID 토큰 을 제공하는 OAuth 기반 OpenID Connect를 위해 Google에서 최근 사용이 중단되고 비활성화되었습니다 .
— Vadzim
당사 사이트를 사용함과 동시에 당사의 쿠키 정책과 개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.