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 위에있는 인증 계층입니다. code
Google의 토큰 엔드 포인트에서 승인 을 교환 할 때 액세스 토큰 ( 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 역할을하는 속성입니다.
"누구세요?" 본질적으로 서비스입니다. 범위 로 액세스 권한을 요청한 다음 Google 프로필 리소스 서버 에 요청 하여 ID를 가져와야합니다. 자세한 내용 은 로그인 용 OAuth 2.0을 참조 하세요.
JWT는 공개 키로 로컬에서 유효성을 검사 할 수 있지만 (Google API 클라이언트 라이브러리는 공개 키를 자동으로 다운로드하고 캐시 함) https://www.googleapis.com/oauth2/v1/tokeninfo 엔드 포인트 를 통해 Google 측에서 토큰을 확인 해야합니다. 토큰 생성 이후 애플리케이션에 대한 액세스가 취소되었는지 확인합니다.
자바 버전
참조 URL : https://stackoverflow.com/questions/8311836/how-to-identify-a-google-oauth2-user
'programing' 카테고리의 다른 글
webdriver.get ()과 webdriver.navigate ()의 차이점 (0) | 2020.12.29 |
---|---|
"aX4j9Z"와 같은 짧은 uid를 생성하는 방법 (JS) (0) | 2020.12.29 |
Play2 스칼라 템플릿에서 변수 선언 (0) | 2020.12.29 |
번들 설치가 공급 업체 / 번들에 gem을 설치하는 이유는 무엇입니까? (0) | 2020.12.29 |
정적이 문맥에 따라 다른 의미를 갖는 이유는 무엇입니까? (0) | 2020.12.29 |