programing

Google OAuth2 사용자를 식별하는 방법은 무엇입니까?

nasanasas 2020. 12. 29. 07:10
반응형

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/


이 메서드를 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


다른 사람들이 언급했듯이 방금받은 OAuth2 베어러 토큰을 사용하여 https://www.googleapis.com/oauth2/v3/userinfo에 GET을 보낼 수 있으며 사용자에 대한 일부 정보 (id , 이름 등).

Google이 OpenID Connect를 구현 하고이 사용자 정보 엔드 포인트는 그 일부에 불과 하다는 점도 언급 할 가치가 있습니다.

OpenID Connect 는 OAuth2 위에있는 인증 계층입니다. codeGoogle의 토큰 엔드 포인트에서 승인 교환 할 때 액세스 토큰 ( access_token매개 변수)과 OpenID Connect ID 토큰 ( id_token매개 변수)을받습니다.

이 두 토큰은 모두 JWT입니다 (JSON 웹 토큰, 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를 프로그래밍 방식으로 디코딩하기위한 다양한 프로그래밍 언어 용 라이브러리도 있습니다.

추신 : Google의 OpenID Connect 제공 업체에서 지원하는 최신 URL 및 기능 목록을 얻으려면 다음 URL을 확인 하십시오 . https://accounts.google.com/.well-known/openid-configuration .


OpenID Connect API가 더 id이상 속성을 반환하지 않는다는 점을 언급해야합니다 .

이제 sub고유 한 사용자 ID 역할을하는 속성입니다.

참조 구글 데브 오픈 ID 연결 사용자 정보를


"누구세요?" 본질적으로 서비스입니다. 범위 로 액세스 권한을 요청한 다음 Google 프로필 리소스 서버요청 하여 ID를 가져와야합니다. 자세한 내용 은 로그인OAuth 2.0을 참조 하세요.


JWT는 공개 키로 로컬에서 유효성을 검사 할 수 있지만 (Google API 클라이언트 라이브러리는 공개 키를 자동으로 다운로드하고 캐시 함) https://www.googleapis.com/oauth2/v1/tokeninfo 엔드 포인트 를 통해 Google 측에서 토큰을 확인 해야합니다. 토큰 생성 이후 애플리케이션에 대한 액세스가 취소되었는지 확인합니다.


자바 버전

OAuth2Sample.java

참조 URL : https://stackoverflow.com/questions/8311836/how-to-identify-a-google-oauth2-user

반응형