오픈아이디 커넥트

구글의 오픈 ID 연결 엔드 포인트는 오픈 ID 인증입니다.

구글의 OAuth 2.0 API는 인증 및 권한 부여를 모두 사용할 수 있습니다. 이 문서는 우리의 OAuth를받는 준수 인증을위한 2.0 구현에 대해 설명 오픈 ID 연결 사양이며 오픈 ID 인증 을 . 에서 발견 된 문서 액세스 구글 API에 대한 OAuth는 2.0을 사용 하여이 이 서비스에 적용됩니다. 대화 형이 프로토콜을 탐구하려는 경우, 우리는 추천 구글의 OAuth 2.0 놀이터 . 에 대한 도움말을 얻으려면 스택 오버플 로 , '구글 - OAuth를'당신의 질문에 태그를.

OAuth는 2.0 설정

응용 프로그램이 사용자 로그인에 대한 구글의 OAuth 2.0 인증 시스템을 사용하기 전에, 당신은에서 프로젝트를 설정해야합니다 Google API Console 하여 OAuth 2.0 자격증을 얻기 위해 리디렉션 URI를 설정하고 (선택적으로) 사용자가에서 볼 수있는 브랜드 정보를 사용자 정의 사용자 동의 화면. 당신은 또한 사용할 수 있습니다 API Console 을 결제를 가능하게 필터링 설정하고 다른 작업을 수행, 서비스 계정을 만들 수 있습니다. 자세한 내용은 참조 Google API Console의 도움말 을 .

OAuth는 2.0 자격 증명을 얻습니다

Google의 API에 사용자와 이득 액세스를 인증하는 데하여 OAuth 클라이언트 ID와 클라이언트의 비밀을 포함하여 2.0 자격 증명을해야합니다.

지정된 OAuth 2.0 자격 증명에 대한 클라이언트 ID 및 클라이언트 암호를 보려면 다음 텍스트를 클릭하십시오. 자격 증명 선택 . 열리는 창에서 프로젝트 및 원하는 자격 증명을 선택한 다음 보기 를 클릭하십시오.

또는 API Console 의 Credentials (인증 정보) 페이지 에서 고객 ID와 고객 비밀번호를 확인하십시오.

  1. Go to the Credentials page.
  2. 신임 정보 또는 연필 ( ) 아이콘을 클릭하십시오. 고객 ID와 비밀번호는 페이지 상단에 있습니다.

리디렉션을 설정 URI

당신이에 설정하는 것이 리디렉션 URI API Console 은 구글이 사용자의 응답을 보내는 위치를 결정 인증 요청 .

지정된 OAuth 2.0 자격 증명에 대한 리디렉션 URI를 만들거나 보거나 편집하려면 다음을 수행하십시오.

  1. Go to the Credentials page.
  2. 페이지의 OAuth 2.0 클라이언트 ID 섹션에서 신임 정보를 클릭하십시오.
  3. 리디렉션 URI를 보거나 편집하십시오.

자격 증명 페이지에 OAuth 2.0 클라이언트 ID 섹션이 없으면 프로젝트에 OAuth 자격 증명이없는 것입니다. 자격 증명 을 만들려면 자격 증명 만들기를 클릭합니다.

사용자 동의 화면을 사용자 정의

사용자의 경우, OAuth는 2.0 인증 경험은 사용자가 공개하고있는 정보와 적용 조건을 설명하는 동의 화면이 포함되어 있습니다. 사용자가 로그인 할 때 예를 들어, 그들은 그들의 이메일 주소와 기본 계정 정보에 앱 액세스 권한을 부여하라는 메시지가 표시 될 수 있습니다. 당신은 사용하여이 정보에 액세스 요청 scope 앱이 자사에 포함 매개 변수를 인증 요청 을 . 또한 다른 Google API에 대한 액세스를 요청에 범위를 사용할 수 있습니다.

사용자 동의 화면은 또한 제품 이름, 로고 및 홈페이지 URL 등의 정보를 브랜딩 제공합니다. 당신은의 브랜드 정보를 제어 API Console.

프로젝트의 동의 화면을 활성화하려면 :

  1. 열기 Consent Screen page 에서 Google API Console .
  2. If prompted, select a project, or create a new one.
  3. 양식을 작성하고 저장을 클릭 하십시오 .

OAuth는 2.0 및 Google 드라이브 범위의 조합이 요청에 존재하는 경우 사용자가 볼 것입니다 무슨 다음 동의 대화 상자를 보여줍니다. (이 일반적인 대화 상자는 사용하여 생성 된 구글의 OAuth 2.0 놀이터 가 설정 될 수 브랜딩 정보가 포함되지 않도록, API Console를 .)

동의 페이지의 스크린 샷

서비스에 액세스

구글과 타사 사용자를 인증하고 구글 API에 대한 액세스 권한을 얻지의 구현 세부 사항의 많은 돌볼하는 데 사용할 수있는 라이브러리를 제공합니다. 예는 구글 로그인구글 클라이언트 라이브러리 다양한 플랫폼에 사용할 수 있습니다.

당신은 HTTP 요청을 설명하는이 문서의 나머지 부분의 지침, 라이브러리를 사용하여 수행하지 않을 경우 그 underly 가능한 라이브러리를 흐른다.

사용자 인증

사용자를 인증하는 것은 ID 토큰을 획득하고이를 검증하는 것을 포함한다. ID 토큰 의 표준화 기능입니다 오픈 ID 연결 은 인터넷에서 신원 주장을 공유에 사용하도록 설계되었습니다.

사용자 인증 및 "서버"라고 토큰 ID를 획득하기 위해 가장 일반적으로 사용되는 방법은 유동 및 "암시"흐름. 서버 흐름은 브라우저 또는 모바일 장치를 사용하는 사람의 신원을 확인하기 위해 애플리케이션의 백엔드 서버를 허용한다. 클라이언트 측 응용 프로그램 (일반적으로 자바 스크립트 앱이 브라우저에서 실행)이 액세스 API를 직접 대신 백엔드 서버를 통해 필요가있을 때 암시 적 흐름이 사용됩니다.

이 문서는 사용자를 인증하는 서버 흐름을 수행하는 방법을 설명한다. 암시 적 흐름은 훨씬 더 때문에, 취급 및 클라이언트 측에서 토큰을 사용하여 보안 위험의 복잡하다. 당신이 암시 적 흐름을 구현해야하는 경우, 우리는 매우 사용하는 것이 좋습니다 구글 로그인을 .

서버 흐름

당신이 확인 에서 앱 설정 API Console 를 이 프로토콜을 사용하여 사용자를 인증 할 수 있도록. 사용자가 Google에 로그인을 시도 할 때, 당신은해야합니다 :

  1. 반 위조 상태 토큰을 생성
  2. 구글에 인증 요청을 보내기
  3. 안티 위조 상태 토큰 확인
  4. 교환 code 액세스 토큰 및 ID 토큰에 대한
  5. 아이디 토큰에서 사용자 정보를 얻
  6. 사용자를 인증

반 위조 상태 토큰 만들기 1

당신은 요청 위조 공격을 방지하여 사용자의 보안을 보호해야합니다. 첫 번째 단계는 응용 프로그램과 사용자의 클라이언트 사이에 상태를 유지하는 고유 한 세션 토큰을 만드는 것입니다. 나중에 사용자가 요청하지 악의적 인 공격자를하고 있는지 확인하기 위해 구글의 OAuth 로그인 서비스에서 반환 인증 응답 토큰이 고유 한 세션을 일치합니다. 이 토큰은 종종 크로스 사이트 요청 위조 (라고도 CSRF ) 토큰.

상태 토큰에 대한 하나 개의 좋은 선택은 30의 문자열 또는 문자 있도록 고품질의 난수 생성기를 사용하여 구성. 또 다른 백 엔드에 비밀을 유지 키로 세션 상태 변수의 일부를 서명에 의해 생성 된 해시입니다.

다음 코드는 고유 한 세션 토큰을 생성 보여줍니다.

PHP

당신은 다운로드해야 PHP가 구글의 API 클라이언트 라이브러리를 이 샘플을 사용할 수 있습니다.

// Create a state token to prevent request forgery.
// Store it in the session for later validation.
$state = bin2hex(random_bytes(128/8));
$app['session']->set('state', $state);
// Set the client ID, token state, and application name in the HTML while
// serving it.
return $app['twig']->render('index.html', array(
    'CLIENT_ID' => CLIENT_ID,
    'STATE' => $state,
    'APPLICATION_NAME' => APPLICATION_NAME
));

자바

당신은 다운로드해야합니다 자바 용 Google API 클라이언트 라이브러리를 이 샘플을 사용할 수 있습니다.

// Create a state token to prevent request forgery.
// Store it in the session for later validation.
String state = new BigInteger(130, new SecureRandom()).toString(32);
request.session().attribute("state", state);
// Read index.html into memory, and set the client ID,
// token state, and application name in the HTML before serving it.
return new Scanner(new File("index.html"), "UTF-8")
    .useDelimiter("\\A").next()
    .replaceAll("[{]{2}\\s*CLIENT_ID\\s*[}]{2}", CLIENT_ID)
    .replaceAll("[{]{2}\\s*STATE\\s*[}]{2}", state)
    .replaceAll("[{]{2}\\s*APPLICATION_NAME\\s*[}]{2}",
    APPLICATION_NAME);

파이썬

당신은 다운로드해야 파이썬 용 Google API 클라이언트 라이브러리를 이 샘플을 사용할 수 있습니다.

# Create a state token to prevent request forgery.
# Store it in the session for later validation.
state = hashlib.sha256(os.urandom(1024)).hexdigest()
session['state'] = state
# Set the client ID, token state, and application name in the HTML while
# serving it.
response = make_response(
    render_template('index.html',
                    CLIENT_ID=CLIENT_ID,
                    STATE=state,
                    APPLICATION_NAME=APPLICATION_NAME))

구글에 인증 요청을 전송합니다

다음 단계는 HTTPS 형성되어 GET 적절한 URI 매개 변수를 요청합니다. 오히려이 과정의 모든 단계에서보다 HTTP HTTPS의 사용을 참고; HTTP 연결이 거부됩니다. 당신은에서 기본 URI 검색해야 검색 문서 사용 authorization_endpoint 의 메타 데이터 값입니다. 다음의 논의는 URI가 기본 가정 https://accounts.google.com/o/oauth2/v2/auth 을 .

기본 요청에 대해 다음과 같은 매개 변수를 지정합니다

  • client_id 당신은에서 API Console의 Credentials page.
  • RESPONSE_TYPE 기본 인증 코드 플로우 response_type 되어야하는 code . (더 많은 읽기 response_type .)
  • scope 기본 요청해야 openid email 을 오픈 ID . (더 많은 읽기 scope .)
  • redirect_uri 구글의 응답을 받게됩니다 서버에 HTTP 끝점을해야합니다. 값은 정확하게 당신이에 구성하여 OAuth 2.0 클라이언트에 대한 인증 된 리디렉션 된 URI 중 하나와 일치해야합니다 API Console의 Credentials page. 이 값이 인증 된 URI와 일치하지 않는 경우, 요청은 실패합니다 redirect_uri_mismatch 의 오류입니다.
  • state 는 안티 위조 고유 한 세션 토큰의 값뿐만 아니라, 예를 들어, 응용 프로그램에 사용자가 반환, URL을 시작할 때 컨텍스트를 복구하는 데 필요한 기타 정보를 포함해야한다. (더 많은 읽기 state .)
  • nonce 가 재생 될 때 보호 선물을 할 수 귀하의 응용 프로그램에 의해 생성 된 임의의 값입니다.
  • login_hint 는 사용자의 이메일 주소 또는 할 수있다 sub 사용자의 Google ID에 해당 문자열. 당신이 제공하지 않는 경우 login_hint 를 사용자가 현재 로그인되어, 동의 화면이 앱에 사용자의 이메일 주소를 해제 승인에 대한 요청이 포함되어 있습니다. (더 많은 읽기 login_hint .)
  • 사용 의 hd 구글 클라우드 조직과 관련된 특정 도메인의 사용자를위한 오픈 ID 연결 흐름을 최적화하는 매개 변수를. (더 많은 읽기 hd .)

여기에 읽기 쉽도록 줄 바꿈과 공백 완전한 오픈 ID 연결 인증 URI의 예입니다 :

https://accounts.google.com/o/oauth2/v2/auth?
 response_type=code&
 client_id=424911365001.apps.googleusercontent.com&
 scope=openid%20email&
 redirect_uri=https%3A//oauth2.example.com/code&
 state=security_token%3D138r5719ru3e1%26url%3Dhttps%3A%2F%2Foauth2-login-demo.example.com%2FmyHome&
 login_hint=jsmith@example.com&
 nonce=0394852-3190485-2490358&
 hd=example.com

사용자는 앱이 그들에 대한 새로운 정보를 요청하거나 앱 요청이 액세스 계정 경우가 이전에 승인되지 않았 음을 경우 동의를해야합니다.

3. 확인 위조 방지 상태 토큰

응답이 전송됩니다 redirect_uri 로 당신이에 지정된 것을 요청 . 아래 그림과 같이 모든 응답은 쿼리 문자열 반환됩니다 :

https://oauth2.example.com/code?state=security_token%3D138r5719ru3e1%26url%3Dhttps%3A%2F%2Foa2cb.example.com%2FmyHome&code=4/P7q7W91a-oMsCeLvIaQm6bTrgtp7&scope=openid%20email%20https://www.googleapis.com/auth/userinfo.email

서버에서, 당신은 확인해야한다 state 에서 만든 토큰 구글에서받은 세션과 일치하는 1 단계 . 이 왕복 검증은 사용자가 아닌 악성 스크립트가 요청을하고 있는지 확인하는 데 도움이됩니다.

다음 코드는 세션을 확인하는 1 단계에서 만든 토큰을 보여줍니다

PHP

당신은 다운로드해야 PHP가 구글의 API 클라이언트 라이브러리를 이 샘플을 사용할 수 있습니다.

// Ensure that there is no request forgery going on, and that the user
// sending us this connect request is the user that was supposed to.
if ($request->get('state') != ($app['session']->get('state'))) {
  return new Response('Invalid state parameter', 401);
}

자바

당신은 다운로드해야합니다 자바 용 Google API 클라이언트 라이브러리를 이 샘플을 사용할 수 있습니다.

// Ensure that there is no request forgery going on, and that the user
// sending us this connect request is the user that was supposed to.
if (!request.queryParams("state").equals(
    request.session().attribute("state"))) {
  response.status(401);
  return GSON.toJson("Invalid state parameter.");
}

파이썬

당신은 다운로드해야 파이썬 용 Google API 클라이언트 라이브러리를 이 샘플을 사용할 수 있습니다.

# Ensure that the request is not a forgery and that the user sending
# this connect request is the expected user.
if request.args.get('state', '') != session['state']:
  response = make_response(json.dumps('Invalid state parameter.'), 401)
  response.headers['Content-Type'] = 'application/json'
  return response

4. 교환 code 액세스 토큰 및 ID 토큰에 대한

응답은 포함 code 매개 변수, 서버가 토큰 액세스 및 ID 토큰 교환 할 수있는 일회성 인증 코드를. 귀하의 서버는 HTTPS 전송하여이 교환하게 POST 의 요청을. POST 의 요청이 당신이에서 검색해야 토큰 엔드 포인트로 전송되어 검색 문서 사용 token_endpoint 메타 데이터 값입니다. 아래에서는 엔드 포인트가 있다고 가정 https://oauth2.googleapis.com/token . 요청은에서 다음 매개 변수가 포함되어야 POST 의 몸을 :

필드
code 에서 반환되는 인증 코드 초기 요청 .
client_id 당신이에서받는 것이 클라이언트 ID API Console의 Credentials page에 설명 된대로 하여 OAuth 2.0 자격 증명을 얻 습니다 .
client_secret 당신이에서받는 것이 클라이언트 비밀 API Console의 Credentials page에 설명 된대로 하여 OAuth 2.0 자격 증명을 얻 습니다 .
redirect_uri 주어진인가 된 리디렉션 URI client_id 에 지정된 API Console의 Credentials page에 기재된 바와 같이, 집합을 리디렉션 URI .
grant_type 이 필드의 값이 포함되어야합니다 authorization_code 을 , 의 OAuth 2.0 사양에 정의 된대로 .

실제 요청의 예는 다음과 같습니다 :

POST /token HTTP/1.1
Host: oauth2.googleapis.com
Content-Type: application/x-www-form-urlencoded

code=4/P7q7W91a-oMsCeLvIaQm6bTrgtp7&
client_id=your-client-id&
client_secret=your-client-secret&
redirect_uri=https%3A//oauth2.example.com/code&
grant_type=authorization_code

이 요청에 성공적인 응답은 JSON 배열의 다음 필드가 포함되어 있습니다 :

필드
access_token 구글 API로 전송 할 수있는 토큰입니다.
expires_in 초 액세스 토큰의 남은 수명.
id_token JWT 디지털 구글에 의해 서명 된 사용자에 대한 식별 정보가 포함되어 있습니다.
scope 액세스의 범위가 부여 access_token 은 공간 구분 대소 문자 스트링의리스트로 표시.
token_type 식별 반환 토큰의 유형입니다. 이 때,이 필드는 항상 값이 Bearer .
refresh_token (선택 과목)

경우이 필드는 존재 access_type 의 파라미터가 설정되어 offline인증 요청 . 상세한 내용은 새로 고침 토큰 을 .

아이디 토큰의 사용자 정보를 얻는 제

아이디 토큰은 인 JWT 입니다 (JSON 웹 토큰), 암호 학적으로 서명 Base64로 인코딩 된 JSON 객체입니다. 일반적으로, 당신이하는 것이 중요합니다 의 ID 토큰의 유효성 을 검사 당신이 그것을 사용하기 전에,하지만 중간없는 HTTPS 채널을 통해 구글 직접 통신 Google에 자신을 인증하는 클라이언트의 비밀을 사용하고 있기 때문에, 당신은 확신 할 수 있습니다 당신 토큰 수신 정말 구글에서오고 유효합니다. 서버 앱의 다른 구성 요소에 토큰 ID를 통과하면, 다른 구성 요소는 것이 매우 중요 토큰의 유효성을 검사 를 사용하기 전에.

대부분의 API 라이브러리가 base64url 인코딩 된 값을 디코딩하고 내 JSON을 구문 분석 작업과 검증을 결합하기 때문에 당신이 ID 토큰의 주장을 액세스 할 때, 당신은 아마 토큰 어쨌든 유효성을 검사 종료됩니다.

의 ID 토큰의 페이로드

이드 토큰은 이름 / 값 쌍의 세트를 포함하는 JSON 객체이다. 여기에 읽기 쉽도록 형식의 예는 다음과 같습니다

{
  "iss": "https://accounts.google.com",
  "azp": "1234987819200.apps.googleusercontent.com",
  "aud": "1234987819200.apps.googleusercontent.com",
  "sub": "10769150350006150715113082367",
  "at_hash": "HK6E_P6Dh8Y93mRNtsDB1Q",
  "hd": "example.com",
  "email": "jsmith@example.com",
  "email_verified": "true",
  "iat": 1353601026,
  "exp": 1353604926,
  "nonce": "0394852-3190485-2490358"
}

구글 ID 토큰 ( 주장 라고도 함) 다음 필드를 포함 할 수 있습니다 :

주장하다 제공 설명
aud 언제나 이 ID 토큰을 대상으로하는 관객. 이 응용 프로그램의의 OAuth 2.0 클라이언트 ID 중 하나 여야합니다.
exp 언제나 아이디 토큰 허용해서는 안 일 이후에 만료 시간. 유닉스 시간 (정수 초)로 표현.
iat 언제나 시간은 ID 토큰이 발행되었다. 유닉스 시간 (정수 초)로 표현.
iss 언제나 응답의 발급자에 대한 발급자 식별자. 항상 https://accounts.google.com 또는 accounts.google.com 구글 ID에 대한 토큰.
sub 언제나 재사용 모든 Google 계정과 결코 사이에서 고유 사용자에 대한 식별자. 구글 계정이 다른 시점에서 여러 이메일 주소를 가질 수 있지만, sub 값이 변경되지 않습니다. 사용 sub 사용자에 대한 고유 식별자 키와 응용 프로그램 내에서. 255 대소 문자를 구분 ASCII 문자의 최대 길이.
at_hash 액세스 토큰 해시. 액세스 토큰은 신원 토큰에 연결되어 있는지 확인을 제공합니다. 아이디 토큰가 발행되면 access_token 은 서버 흐름 값이 제는 항상 포함된다. 이 주장은 크로스 사이트 요청 위조 공격으로부터 보호하는 다른 메커니즘으로 사용할 수 있지만, 당신이 따르는 경우 1 단계 와 3 단계 는 액세스 토큰을 검증 할 필요가 없습니다.
azp client_id 인증 된 발표자의. 아이디 토큰을 요청하는 당사자가 ID 토큰의 관객과 동일하지 않을 때이 주장은 필요하다. 이 웹 응용 프로그램 및 안드로이드 응용 프로그램은 다른의 OAuth 2.0이 하이브리드 애플 리케이션을위한 구글의 경우 수 있습니다 client_id 을 하지만 같은 구글의 API 프로젝트를 공유 할 수 있습니다.
email 사용자의 이메일 주소입니다. 이 값은 사용자에 고유하지 않으며 기본 키로서 사용하기에 적합하지 않은 수도있다. 당신의 범위가 포함 된 경우에만 제공 email 범위의 값입니다.
email_verified 사실 사용자의 전자 메일 주소가 확인 된 경우; 그렇지 않은 경우는 false.
family_name 사용자의 성 (들) 또는 이름 (들). 때 제공 될 수 name 제가 존재한다.
given_name 사용자의 주어진 이름 또는 이름 (들). 때 제공 될 수 name 제가 존재한다.
hd 사용자의 Google 클라우드 조직과 관련된 도메인입니다. 사용자가 Google 클라우드 조직에 속한 경우에만 제공.
locale a로 표시되는 사용자의 로케일, BCP 47 언어 태그. 때 제공 될 수 name 제가 존재한다.
name 사용자의 전체 이름, 표시 가능한 형태이다. 때 제공 될 수 있습니다
  • 요청 범위는 문자열 "프로파일"을 포함
  • 아이디 토큰은 토큰 새로 고침에서 반환

name 주장이 존재, 당신은 앱의 사용자 레코드를 업데이트하는 데 사용할 수 있습니다. 이 주장이 존재하는 것으로 보장되지 않습니다 있습니다.

nonce 의 값 nonce 는 인증 요청에 응용 프로그램에 의해 제공. 한 번만 제시를 보장함으로써 재생 공격에 대한 보호를 강화해야한다.
picture 사용자의 프로필 사진의 URL. 때 제공 될 수 있습니다
  • 요청 범위는 문자열 "프로파일"을 포함
  • 아이디 토큰은 토큰 새로 고침에서 반환

picture 요구가 존재, 당신은 앱의 사용자 레코드를 업데이트하는 데 사용할 수 있습니다. 이 주장이 존재하는 것으로 보장되지 않습니다 있습니다.

profile 사용자의 프로필 페이지의 URL입니다. 때 제공 될 수 있습니다
  • 요청 범위는 문자열 "프로파일"을 포함
  • 아이디 토큰은 토큰 새로 고침에서 반환

profile 주장이 존재, 당신은 앱의 사용자 레코드를 업데이트하는 데 사용할 수 있습니다. 이 주장이 존재하는 것으로 보장되지 않습니다 있습니다.

6. 인증하고 사용자

아이디 토큰에서 사용자 정보를 획득 한 후 앱의 사용자 데이터베이스를 조회한다. 사용자가 이미 데이터베이스에 존재하는 경우 모든 로그인 요구 사항은 구글 API 응답에 의해 충족 될 경우, 해당 사용자에 대한 응용 프로그램 세션을 시작해야합니다.

사용자가 사용자 데이터베이스에 존재하지 않는 경우, 새로운 사용자 가입 흐름에 사용자를 리디렉션합니다. 당신은 할 수 있습니다에 자동 등록 당신이 구글에서 수신 또는 적어도 당신이 당신의 등록 양식에서 요구하는 분야의 많은 미리 입력 할 수 있습니다 정보를 기반으로 사용자를. 아이디 토큰의 정보 외에도 추가로 얻을 수있는 사용자 프로파일 정보 를 우리의 사용자 프로파일 엔드 포인트에 있습니다.

고급 주제

다음 섹션에서는 더 자세히 구글의 OAuth 2.0 API를 설명합니다. 이 정보는 인증 및 권한 부여 주위에 고급 요구 사항 개발자를위한 것입니다.

다른 Google API에 액세스

인증의 OAuth 2.0을 사용의 장점 중 하나는 응용 프로그램이 사용자를 인증으로 허가를 동시에 (예 : 유튜브, 구글 드라이브, 캘린더 또는 연락처 등) 사용자를 대신하여 다른 Google API를 사용하여 얻을 수 있다는 것입니다. 이렇게하려면, 당신은에서 필요로하는 다른 범위를 포함하는 인증 요청 Google에 보내. 예를 들어, 사용자의 인증 요청에 사용자의 연령 그룹을 추가하는 범위 매개 변수를 전달하는 openid email https://www.googleapis.com/auth/profile.agerange.read 을 . 사용자는에 적절하게하라는 메시지가 표시됩니다 동의 화면 . 다시 구글에서받을 수 액세스 토큰을 사용하면 요청과 부여 된 액세스의 범위와 관련된 모든 API에 액세스 할 수 있습니다.

새로 고침 토큰

API 액세스에 대한 요청에서 당신은 동안 반환하는 토큰 새로 고침 요청할 수 있습니다 code 교환 을 . 사용자가 응용 프로그램에 존재하지 않는 동안 구글 API에 앱이 지속적으로 액세스를 제공하는 토큰 새로 고침. 새로 고침 토큰을 요청하려면 설정 추가 할 access_type 의 에 매개 변수 offline 으로 당신의 인증 요청 .

고려 사항 :

  • 당신은 단지 당신이 코드 교환 흐름을 수행하는 것은 이번이 처음 토큰 새로 고침을 얻을 수 있기 때문에, 안전하고 영구적으로 토큰 새로 고침을 저장해야합니다.
  • 이 발행 새로 고침 토큰의 수에 제한은 다음과 같습니다 클라이언트 / 사용자 조합 당 하나 개의 제한은, 다른 모든 클라이언트에서 사용자 당. 응용 프로그램의 요청에 너무 많은 새로 고침 토큰 경우, 그 경우 나이가 새로 고침이 정지 작업을 토큰, 이러한 제한으로 실행할 수 있습니다.

자세한 내용은 (오프라인 액세스) 액세스 토큰을 새로 고침 .

당신은 설정하여 응용 프로그램을 다시 권한을 부여 할 수있는 사용자 메시지를 표시 할 수 있습니다 prompt 에 매개 변수 consent 를 당신의 인증 요청 을 . 때 prompt=consent 가 포함되어 동의 화면이 모든 범위가 이전에 구글 API를 프로젝트에 부여 된 경우에도 앱이 액세스 범위의 승인을 요청할 때마다 표시됩니다. 이러한 이유로 포함 prompt=consent 가 필요한 경우에만.

[정보 자세한 내용은 prompt 매개 변수를 참조 prompt 에서 인증 URI 매개 변수 테이블.

인증 URI 매개 변수

다음 표는 구글의 OAuth 2.0 인증 API에서 허용하는 매개 변수의 더 완전한 설명을 제공합니다.

매개 변수 필수의 설명
client_id (필수의) 당신이에서받는 것이 클라이언트 ID 문자열 API Console의 Credentials page에 기술 된 바와 같이, OAuth는 2.0 자격 증명을 얻 습니다 .
nonce (필수의) 재생 보호 할 수 귀하의 응용 프로그램에 의해 생성 된 임의의 값.
response_type (필수의) 값이 경우 code ,이 출시 기본 인증 코드 흐름 필요 POST 를 토큰을 얻기 위해 토큰 엔드 포인트에. 값이면 token id_token 또는 id_token token , 발사 암시 플로우 로부터 토큰을 검색하기 위해 리다이렉트 URI에서 자바 스크립트의 사용을 요구 URI를 #fragment 의 식별자 .
redirect_uri (필수의) 응답을 보낸 장소를 판정합니다. 이 매개 변수의 값은 정확하게 당신이 설정하는 권한이 부여 된 리디렉션 값 중 하나와 일치해야합니다 API Console의 Credentials page (있는 경우, '/'HTTP 또는 HTTPS 방식의 경우를 포함하여, 후행).
scope (필수의)

범위 파라미터는 시작되어야 openid 값을 포함하고 profile 값은 email 값 또는 둘.

profile 범위 값이 존재의 ID 토큰 힘은 (다만 보증되지는 않았다) 사용자의 기본 포함 profile 주장.

경우] email 범위 값이 존재하는 상기 ID 토큰을 포함하는 emailemail_verified 청구.

이러한 오픈 ID 특정 범위뿐만 아니라, 스코프 인수는 다른 범위의 값을 포함 할 수 있습니다. 모든 범위의 값은 공간으로 분리해야한다. 당신이 사용자의 Google 드라이브에 파일 별 접근을 원하는 경우 예를 들어, 당신의 범위 매개 변수는 다음과 같을 수 있습니다 openid profile email https://www.googleapis.com/auth/drive.file .

가능한 범위에 대한 내용은 다음을 참조 하여 OAuth 2.0 구글 API에 대한 스코프 또는 사용하려는 구글의 API에 대한 설명서가.

state (선택 사항이 있지만, 권장)

프로토콜의 라운드 트립 불투명 문자열; 즉,이 기초 흐름에 URI 파라미터로서 리턴하고, URI에이며, 말하자면 #fragment 의 암시 적 흐름 식별자.

state 는 요청과 응답의 상관 관계를 유용 할 수 있습니다. 당신 때문에 redirect_uri 로이 추측 할 수있는하는 사용 state 값은 들어오는 연결 앱에 의해 시작된 인증 요청의 결과라고 당신의 확신을 증가시킬 수있다. 당신이 경우 임의의 문자열을 생성 하거나이에 (예를 들어, 쿠키) 일부 클라이언트 상태의 해시를 인코딩 state 변수를 추가로 요청과 응답은 동일한 브라우저에서 유래되었는지 확인하려면 응답의 유효성을 검사 할 수 있습니다. 이것은 크로스 사이트 요청 위조 등의 공격에 대한 보호 기능을 제공합니다.

access_type (선택 과목) 허용되는 값은 offlineonline . 효과는에 설명되어 오프라인 액세스 ; 액세스 토큰이 요청되는 경우, 클라이언트의 값 않는 토큰을 새로 고침받지 않습니다 offline 이 지정됩니다.
display (선택 과목) 지정에 대한 ASCII 문자열 값에서는 인증 서버는 인증 및 동의 사용자 인터페이스 페이지를 표시합니다. 다음과 같은 값을 지정하고 Google 서버에서 허용하지만, 그 동작에 영향이없는됩니다 page , popup , touch , 그리고 wap 을 .
hd (선택 과목)

구글 클라우드 조직이 소유 계정에 대한 로그인 프로세스를 간소화합니다. (예를 들어, Google 클라우드 조직 도메인을 포함하여 mycollege.edu 을 ), 당신은 계정 선택 UI가 해당 도메인의 계정에 최적화되어야 함을 나타낼 수 있습니다. Google 클라우드 조직에 대한 최적화에 별표 (값 설정, 일반적으로 대신 한 Google 클라우드 조직 도메인의 계정 * hd=* 를 .

클라이언트 측 요청이 수정 될 수있는 앱에 액세스 할 수있는 사용자를 제어하기 위해 UI 최적화에 의존하지 마십시오. 확인하는 유효성토큰을 반환 ID 가 의 hd 경기가 예상 무엇을 주장 값 (예 mycolledge.edu ). 요청 매개 변수와는 달리, ID 토큰 의 hd 값을 신뢰할 수 있도록 주장은, 구글에서 토큰 보안에 포함됩니다.

include_granted_scopes (선택 과목) 이 매개 변수 값으로 제공되는 경우 는 true , 및 승인 요청이 승인 권한 부여는 다른 범위이 사용자 / 애플리케이션 조합에 부여 된 이전의 모든 권한을 포함 할 것이다; 참조 증분 인증 을 .

당신은 설치된 응용 프로그램의 흐름을 증가 허가를 할 수 없습니다.

login_hint (선택 과목) 앱이 인증을 시도하는 사용자가 알고있는 때, 인증 서버의 힌트로이 매개 변수를 제공 할 수 있습니다. 사전 채우기 중 계정 선택기는이 힌트를 억제 전달하고 전자 우편 상자는 로그인 양식, 또는 선택 적절한 세션 (사용자가 사용하는 경우 여러 로그인 앱 경우 발생하는 문제를 방지 할 수 있습니다) 잘못된 사용자 계정에 로그인합니다. 값은 이메일 주소 나 될 수 있습니다 sub 사용자의 Google ID에 해당 문자열.
prompt (선택 과목) 문자열 값의 공백으로 구분 된 목록이 있다고는 인증 서버는 재 인증 및 동의에 대한하라는 메시지를 표시할지 여부를 지정합니다. 가능한 값은 다음과 같습니다
  • none

    인증 서버는 인증 또는 사용자 동의 화면을 표시하지 않습니다; 사용자가 이미 인증되지 않은 요청 된 범위에 대한 동의를 미리 구성하지 않은 경우 오류를 반환합니다. 당신은 사용할 수 none 을 기존 인증 및 / 또는 동의를 확인 할 수 있습니다.

  • consent

    권한 부여 서버는 클라이언트에 정보를 반환하기 전에 동의를 사용자에게 메시지를 표시합니다.

  • select_account

    인증 서버는 사용자 계정을 선택하라는 메시지를 표시합니다. 이 인증 서버에서 여러 계정을 가진 사용자들이 현재 세션을 가질 수있는 여러 계정 사이에 선택할 수 있습니다.

값이 지정되지 않은 사용자가 이전에 액세스 권한을 부여하지 않은 경우, 사용자가 동의 화면이 표시됩니다.

아이디 토큰 검증

당신은 당신이 Google에서 직접 온 것을 알고하지 않는 한 서버의 모든 ID 토큰의 유효성을 검사해야합니다. 모든 ID는이 클라이언트 응용 프로그램에서받은 토큰 정통 예를 들어, 서버가 확인해야합니다.

당신이 당신의 서버에 ID 토큰을 보낼 수있는 일반적인 상황은 다음과 같습니다 :

  • 인증을 받아야 요청 ID 토큰을 보내기. 의 ID 토큰은 당신에게 요청하는 특정 사용자에게 어느 클라이언트 ID 토큰이 부여되었다.

ID 토큰은 민감하고 차단하는 경우 악용 될 수 있습니다. 이러한 토큰은 HTTPS를 통해 만 POST 데이터를 통해 또는 요청 헤더 내에서 전송에 의해 안전하게 처리되어 있는지 확인해야합니다. 당신이 당신의 서버에 ID 토큰을 저장하는 경우, 당신은 또한 안전하게 저장해야합니다.

ID 유용 토큰을 만드는 것은 당신이 그 (것)들에게 앱 주위에 다른 구성 요소를 전달할 수 있다는 사실이다. 이들 구성 요소는 애플리케이션 및 사용자 인증 경량 인증 방식으로 토큰 ID를 사용할 수있다. 당신이 토큰 ID의 정보를 사용하거나 사용자가 인증했다는 주장으로 의존하기 전에, 당신은 그것을 확인 해야 합니다.

의 ID 토큰의 검증은 여러 단계가 필요합니다 :

  1. 아이디 토큰이 제대로 발행자에 의해 서명되어 있는지 확인합니다. 구글에서 발행 한 토큰은 URI가에 규정에서 인증서 중 하나가 발견하여 서명 jwks_uri 의 메타 데이터 값 검색 문서 .
  2. 의 값이 있는지 확인 iss 의 아이디 토큰이 제 같다 https://accounts.google.com 또는 accounts.google.com .
  3. 의 값이 있는지 확인 aud 의 아이디 토큰의 주장이 앱의 클라이언트 ID와 동일합니다.
  4. 만료 시간 (즉, 확인 exp 아이디 토큰 제)를 통과하지 않았다.
  5. 당신이 지정된 경우 HD 매개 변수 요청에 값을의 ID 토큰이 있는지 확인 의 hd 구글 클라우드 조직과 관련된 허용 도메인과 일치하는 주장.

단계 2 ~ 5 그래서 우리는 여기에 세부 사항을하지 않습니다, 매우 간단에만 문자열 및 날짜 비교를 포함한다.

첫 번째 단계는보다 복잡하며, 암호화 서명 확인을 포함한다. 디버깅 목적을 위해, 당신은 구글의를 사용할 수 있습니다 tokeninfo 서버 또는 장치에 구현 현지 처리에 대해 비교하는 엔드 포인트. 귀하의 ID 토큰의 값이 가정 XYZ123 . 그런 다음 URI 역 참조 https://oauth2.googleapis.com/tokeninfo?id_token= XYZ123 . 토큰 서명이 유효한 경우, 응답은 디코딩 JSON 객체 형태로 JWT 페이로드 될 것입니다.

tokeninfo 엔드 포인트는 디버깅하지만 생산을 위해 유용, 키에서 구글의 공개 키는 엔드 포인트와 로컬 유효성 검사를 수행 검색 할 수 있습니다. 당신은에서 키 URI 검색해야 검색 문서 를 사용 jwks_uri 메타 데이터 값입니다. 디버깅 엔드 포인트에 대한 요청은 간헐적으로 오류를 가하지 스로틀 또는 할 수있다.

구글은 자주 자신의 공개 키를 변경 때문에, 당신은 대부분의 경우에서를 사용하여보다 훨씬 더 효율적으로 지역의 유효성 검사를 수행, HTTP 응답의 캐시 지시자를 사용하여 캐시 할 수 있습니다 tokeninfo 엔드 포인트. 이 검증은 검색하고 인증서를 구문 분석하고, 서명을 확인하기 위해 적절한 암호화 호출을 필요로한다. 다양한 언어로 제공 다행히이 잘 디버깅하는 라이브러리 (참조 이러한 목표를 달성하기 위해 jwt.io ).

사용자 프로파일 정보를 취득

사용자에 대한 자세한 프로필 정보를 얻으려면, 당신은 (응용 프로그램이 동안받는 액세스 토큰을 사용하여 인증 흐름 )과 오픈 ID 연결 기준 :

  1. 오픈 ID 호환 될하려면 포함되어야합니다 오픈 ID openid profile 당신의 범위 값 인증 요청 을 .

    당신이 사용자의 이메일 주소를 포함 할 경우의 추가 범위의 값을 지정할 수 있습니다 email 을 . 모두 지정하려면 profileemail 을 , 당신은 당신의 인증 요청 URI에서 다음 매개 변수를 포함 할 수 있습니다 :

    scope=openid%20profile%20email
  2. 인증 헤더에 토큰에 대한 액세스를 추가하고 HTTPS하게 GET 사용자 정보 엔드 포인트, 당신은에서 검색해야하는에 요청 발견 문서 사용 userinfo_endpoint 의 메타 데이터 값입니다. 사용자 정보는 응답에 기술 된 사용자에 대한 정보를 포함하는 OpenID Connect Standard Claims 항 및 claims_supported 디스커버리 문서의 메타 데이터 값. 액세스의 허가 범위에 대한 모든 필드에 대한 정보를 얻을 수 있도록 사용자 또는 조직, 공급 또는 특정 필드 보류 선택할 수 있습니다.

디스커버리 문서

오픈 ID 연결 프로토콜은 사용자를 인증하고 토큰, 사용자 정보 및 공개 키를 포함하여 자원을 요청하기위한 여러 엔드 포인트의 사용을 필요로한다.

구현 및 증가 유연성을 단순화하기 위해, 오픈 ID 연결은 "발견 문서"는 JSON 문서 승인의 URI를 포함한 오픈 ID 연결 공급자의 구성에 대한 세부 정보를 제공 키 - 값 쌍을 포함하는 잘 알려진 위치에서 발견의 사용을 허용 토큰, 취소, 사용자 정보, 공공 - 키 엔드 포인트. 구글의 오픈 ID 연결 서비스에 대한 검색 문서에서 검색 할 수 있습니다 :

https://accounts.google.com/.well-known/openid-configuration

구글의 오픈 ID 연결 서비스를 사용하려면,해야 하드 코드 발견 - 문서 URI ( https://accounts.google.com/.well-known/openid-configuration 응용 프로그램에). 귀하의 응용 프로그램은 응답에 규칙을 캐싱 적용, 문서를 가져 오는 필요에 따라으로부터 엔드 포인트 URI를 검색합니다. 예를 들어, 사용자를 인증하기 위해, 코드가 검색 할 authorization_endpoint 의 (메타 값 https://accounts.google.com/o/oauth2/v2/auth 로 전송되는 인증 요청에 대한 기본 URI로서 아래의 예)를 Google.

여기서 이러한 문서의 예이다; 필드 이름에 지정된있는 오픈 ID 연결 디스커버리 1.0 (그 의미에 대해 해당 문서 참조). 그들은 실제 구글 검색 문서의 최신 버전에서 복사되지만 값은 순전히 예시 및 변경 될 수 있습니다 :

{
  "issuer": "https://accounts.google.com",
  "authorization_endpoint": "https://accounts.google.com/o/oauth2/v2/auth",
  "device_authorization_endpoint": "https://oauth2.googleapis.com/device/code",
  "token_endpoint": "https://oauth2.googleapis.com/token",
  "userinfo_endpoint": "https://openidconnect.googleapis.com/v1/userinfo",
  "revocation_endpoint": "https://oauth2.googleapis.com/revoke",
  "jwks_uri": "https://www.googleapis.com/oauth2/v3/certs",
  "response_types_supported": [
    "code",
    "token",
    "id_token",
    "code token",
    "code id_token",
    "token id_token",
    "code token id_token",
    "none"
  ],
  "subject_types_supported": [
    "public"
  ],
  "id_token_signing_alg_values_supported": [
    "RS256"
  ],
  "scopes_supported": [
    "openid",
    "email",
    "profile"
  ],
  "token_endpoint_auth_methods_supported": [
    "client_secret_post",
    "client_secret_basic"
  ],
  "claims_supported": [
    "aud",
    "email",
    "email_verified",
    "exp",
    "family_name",
    "given_name",
    "iat",
    "iss",
    "locale",
    "name",
    "picture",
    "sub"
  ],
  "code_challenge_methods_supported": [
    "plain",
    "S256"
  ]
}

당신은 발견 문서에서 값을 캐싱하여 HTTP의 왕복을 방지 할 수 있습니다. 표준 HTTP 캐싱 헤더를 사용하고 존중해야한다.

클라이언트 라이브러리

다음 클라이언트 라이브러리는 인기있는 프레임 워크와 통합하여 OAuth 2.0 간단하게 구현합니다

오픈 ID 연결 준수

구글의 OAuth 2.0 인증 시스템은 지원 에 필요한 기능오픈 ID 연결 핵심 사양. 오픈 ID 연결에서 작동하도록 설계되는 모든 클라이언트 (의 제외하고이 서비스와 상호 운용해야한다 오픈 ID 요청 개체 ).