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.