서버 간 애플리케이션에 OAuth 2.0 사용

Google OAuth 2.0 시스템은 웹 애플리케이션과 Google 서비스 간의 상호 작용과 같은 서버 간 상호 작용을 지원합니다. 이 시나리오는 응용 프로그램에 대신의 개별 최종 사용자에 속하는 계정 인 서비스 계정이 필요합니다. 애플리케이션은 서비스 계정을 대신하여 Google API를 호출하므로 사용자가 직접적으로 관여하지 않습니다. 이 시나리오를 "two-legged OAuth" 또는 "2LO"라고도 합니다. (관련 용어 "three-legged OAuth"는 애플리케이션이 최종 사용자를 대신하여 Google API를 호출하고 때때로 사용자 동의가 필요한 시나리오를 나타냅니다.)

일반적으로 애플리케이션은 Google API를 사용하여 사용자 데이터가 아닌 자체 데이터로 작업할 때 서비스 계정을 사용합니다. 예를 들어 데이터 지속성을 위해 Google Cloud Datastore를 사용하는 애플리케이션은 서비스 계정을 사용하여 Google Cloud Datastore API에 대한 호출을 인증합니다.

또한 수있는 Google 작업 공간 도메인 관리자 서비스를 부여 도메인 전체에 권한 계정 도메인의 사용자를 대신하여 액세스 사용자 데이터를.

이 문서에서는 애플리케이션이 Google API 클라이언트 라이브러리(권장) 또는 HTTP를 사용하여 서버 간 OAuth 2.0 흐름을 완료하는 방법을 설명합니다.

개요

지원 서버 간 상호 작용에 먼저 귀하의 프로젝트에 대한 서비스 계정 생성 API Console. Google Workspace 계정 사용자의 사용자 데이터에 액세스하려면 서비스 계정에 대한 도메인 전체 액세스 권한을 위임하세요.

그런 다음 애플리케이션은 서비스 계정의 자격 증명을 사용하여 OAuth 2.0 인증 서버에서 액세스 토큰을 요청하여 승인된 API 호출을 준비합니다.

마지막으로 애플리케이션은 액세스 토큰을 사용하여 Google API를 호출할 수 있습니다.

서비스 계정 만들기

서비스 계정의 자격 증명에는 고유한 생성된 이메일 주소와 하나 이상의 공개/개인 키 쌍이 포함됩니다. 도메인 전체 위임이 활성화된 경우 클라이언트 ID도 서비스 계정 자격 증명의 일부입니다.

애플리케이션이 Google App Engine에서 실행되는 경우 프로젝트를 만들 때 서비스 계정이 자동으로 설정됩니다.

애플리케이션이 Google Compute Engine에서 실행되는 경우 프로젝트를 생성할 때 서비스 계정도 자동으로 설정되지만 Google Compute Engine 인스턴스를 생성할 때 애플리케이션이 액세스해야 하는 범위를 지정해야 합니다. 자세한 내용은 사용하는 서비스 계정에 인스턴스를 준비 .

응용 프로그램이 구글 앱 엔진 또는 Google Compute Engine에서 실행되지 않는 경우에 이러한 자격 증명을 받아야합니다 Google API Console. 서비스 계정 자격 증명을 생성하거나 이미 생성한 공개 자격 증명을 보려면 다음을 수행합니다.

  1. Service accounts page 엽니 Service accounts page .
  2. If prompted, select a project, or create a new one.
  3. 서비스 계정 생성 클릭하십시오.
  4. 서비스 계정 세부 사항 아래에서 서비스 계정 의 이름, ID 및 설명을 입력 한 후 작성 을 클릭 하십시오 .
  5. 옵션 : 서비스 계정 권한 아래에서 서비스 계정 에 부여 할 IAM 역할을 선택한 다음 계속 을 클릭합니다.
  6. 선택 사항 : 사용자에게이 서비스 계정에 대한 액세스 권한 부여 에서 서비스 계정 을 사용하고 관리 할 수있는 사용자 또는 그룹을 추가하십시오.
  7. 작성 키 를 클릭 한 후 작성 을 클릭 하십시오 .

새로운 공개 / 개인 키 쌍이 생성되어 시스템에 다운로드됩니다. 개인 키의 유일한 사본 역할을합니다. 안전하게 보관해야합니다. 이 키 페어를 잃으면 새 키 페어를 생성해야합니다.

서비스 계정에 G Suite 도메인 전체 권한 을 부여해야하는 경우 생성 한 서비스 계정의 이메일 주소를 클릭 한 다음 고유 ID 상자에서 값을 복사하십시오.

서비스 계정에 권한을 위임하려면 클라이언트 ID로 복사 한 값을 사용하십시오.

당신은 돌아갈 수 API Console 이메일 주소, 공개 키 지문 및 기타 정보를 볼 수 또는 추가 공개 / 개인 키 쌍을 생성하기 위해 언제든지. 에서 서비스 계정 자격 증명에 대한 자세한 내용은 API Console참조 서비스 계정 에 API Console도움말 파일.

서비스 계정의 이메일 주소를 기록하고 애플리케이션에서 액세스할 수 있는 위치에 서비스 계정의 개인 키 파일을 저장합니다. 애플리케이션에서 승인된 API 호출을 수행하는 데 필요합니다.

서비스 계정에 도메인 전체 권한 위임

Google Workspace 계정이 있는 경우 조직의 관리자는 애플리케이션이 Google Workspace 도메인의 사용자를 대신하여 사용자 데이터에 액세스하도록 승인할 수 있습니다. 예를 들어 Google 캘린더 API를 사용하여 Google Workspace 도메인에 있는 모든 사용자의 캘린더에 이벤트를 추가하는 애플리케이션은 서비스 계정을 사용하여 사용자를 대신하여 Google 캘린더 API에 액세스합니다. 도메인의 사용자를 대신하여 데이터에 액세스하도록 서비스 계정에 권한을 부여하는 것을 서비스 계정에 "도메인 전체 권한 위임"이라고 하는 경우가 있습니다.

, 서비스 계정에 도메인 전체에 권한을 위임 먼저 기존 서비스 계정의 도메인 전체 위임을 사용하려면 Service accounts page 또는 새 서비스 계정을 만들 도메인 전체 대표단 활성화.

그런 다음 Google Workspace 도메인의 최고 관리자는 다음 단계를 완료해야 합니다.

  1. 당신의 구글 작업 공간 도메인에서 관리 콘솔 메인 메뉴로 이동 > 보안> API를 제어합니다.
  2. 도메인 넓은 위임 창에서 도메인 와이드 위임 관리를 선택합니다.
  3. 클릭 새로운 추가합니다.
  4. 클라이언트 ID 필드에 서비스 계정의 클라이언트 ID를 입력합니다. 당신은 당신의 서비스 계정의 클라이언트 ID 찾을 수 있습니다 Service accounts page.
  5. 의 OAuth 범위에서 (쉼표로 구분) 필드는 응용 프로그램이 액세스 권한을 부여해야한다는 범위의 목록을 입력합니다. 예를 들어, 응용 프로그램이 Google 드라이브 API와 구글 캘린더 API에 도메인 전체에 대한 전체 액세스 권한을 필요로하는 경우, 입력 : https://www.googleapis.com/auth/drive, https://www.googleapis.com/auth / 달력.
  6. 권한 부여를 클릭합니다.

이제 애플리케이션에 도메인의 사용자로 API 호출을 수행할 수 있는 권한이 있습니다(사용자를 "가장"하기 위해). 승인된 API 호출을 준비할 때 가장할 사용자를 지정합니다.

승인된 API 호출 준비

자바

당신이에서 클라이언트의 이메일 주소와 개인 키를 구한 후 API Console, 사용 자바 용 Google API 클라이언트 라이브러리를 만들 GoogleCredential 서비스 계정의 자격 증명에서 개체를하고는 응용 프로그램에 액세스해야 스코프. 예를 들어:

import com.google.api.client.googleapis.auth.oauth2.GoogleCredential;
import com.google.api.services.sqladmin.SQLAdminScopes;

// ...

GoogleCredential credential = GoogleCredential.fromStream(new FileInputStream("MyProject-1234.json"))
    .createScoped(Collections.singleton(SQLAdminScopes.SQLSERVICE_ADMIN));

당신이 구글 클라우드 플랫폼에서 응용 프로그램을 개발하는 경우, 당신은 사용할 수있는 응용 프로그램의 기본 자격 증명을 하는 과정을 단순화 할 수있는 대신에.

도메인 전체 권한 위임

서비스 계정에 도메인 전체 액세스를 위임하고 사용자 계정을 가장 할 경우에 사용자 계정의 이메일 주소를 지정 createDelegated 의 방법 GoogleCredential 개체를. 예를 들어:

GoogleCredential credential = GoogleCredential.fromStream(new FileInputStream("MyProject-1234.json"))
    .createScoped(Collections.singleton(SQLAdminScopes.SQLSERVICE_ADMIN))
    .createDelegated("user@example.com");

사용 GoogleCredential 응용 프로그램에서 구글 API를 호출하는 객체.

파이썬

당신이에서 클라이언트의 이메일 주소와 개인 키를 구한 후 API Console, 사용 파이썬 용 Google API 클라이언트 라이브러리를 다음 단계를 완료합니다 :

  1. 크리에이트 Credentials 서비스 계정의 자격 증명에서 개체를하고는 응용 프로그램에 액세스해야 스코프. 예를 들면 다음과 같습니다
    from google.oauth2 import service_account
    
    SCOPES = ['https://www.googleapis.com/auth/sqlservice.admin']
    SERVICE_ACCOUNT_FILE = '/path/to/service.json'
    
    credentials = service_account.Credentials.from_service_account_file(
            SERVICE_ACCOUNT_FILE, scopes=SCOPES)

    당신이 구글 클라우드 플랫폼에서 응용 프로그램을 개발하는 경우, 당신은 사용할 수있는 응용 프로그램의 기본 자격 증명을 하는 과정을 단순화 할 수있는 대신에.

  2. 도메인 전체 권한 위임

    서비스 계정에 도메인 전체 액세스를 위임하고 사용자 계정을 가장 할 경우, 사용 with_subject 기존의 방법 ServiceAccountCredentials 개체를. 예를 들어:

    delegated_credentials = credentials.with_subject('user@example.org')

Credentials 개체를 사용하여 애플리케이션에서 Google API를 호출합니다.

HTTP/휴식

당신이에서 클라이언트 ID와 개인 키를 구한 후 API Console, 응용 프로그램이 다음 단계를 완료해야합니다 :

  1. 헤더, 클레임 세트 및 서명을 포함하는 JSON 웹 토큰(JWT, 발음, "jot")을 만듭니다.
  2. Google OAuth 2.0 인증 서버에서 액세스 토큰을 요청합니다.
  3. Authorization Server가 반환하는 JSON 응답을 처리합니다.

다음 섹션에서는 이러한 단계를 완료하는 방법을 설명합니다.

응답이 액세스 토큰이 포함되어있는 경우에 액세스 토큰 사용할 수있는 구글 API를 호출을 . (응답에 액세스 토큰이 포함되어 있지 않으면 JWT 및 토큰 요청이 제대로 구성되지 않았거나 서비스 계정에 요청된 범위에 액세스할 수 있는 권한이 없을 수 있습니다.)

액세스 토큰이되면 만료 , 응용 프로그램이 다른 JWT, 표지판을 생성하고, 다른 액세스 토큰을 요청합니다.

서버 애플리케이션은 JWT를 사용하여 Google Authorization Server에서 토큰을 요청한 다음 토큰을 사용하여 Google API 엔드포인트를 호출합니다. 최종 사용자가 관여하지 않습니다.

이 섹션의 나머지 부분에서는 JWT 생성, JWT 서명, 액세스 토큰 요청 구성 및 응답 처리에 대한 세부 사항을 설명합니다.

JWT 만들기

JWT는 헤더, 클레임 세트 및 서명의 세 부분으로 구성됩니다. 헤더 및 클레임 집합은 JSON 개체입니다. 이러한 JSON 개체는 UTF-8 바이트로 직렬화된 다음 Base64url 인코딩을 사용하여 인코딩됩니다. 이 인코딩은 반복적인 인코딩 작업으로 인한 인코딩 변경에 대한 복원력을 제공합니다. 헤더 제 세트 및 서명 기간 (함께 연결된다 . ) 문자.

JWT는 다음과 같이 구성됩니다.

{Base64url encoded header}.{Base64url encoded claim set}.{Base64url encoded signature}

서명의 기본 문자열은 다음과 같습니다.

{Base64url encoded header}.{Base64url encoded claim set}
JWT 헤더 구성

헤더는 서명 알고리즘과 어설션 형식을 나타내는 두 개의 필드로 구성됩니다. 두 필드 모두 필수이며 각 필드에는 하나의 값만 있습니다. 추가 알고리즘 및 형식이 도입되면 이 헤더가 그에 따라 변경됩니다.

서비스 계정은 RSA SHA-256 알고리즘과 JWT 토큰 형식에 의존합니다. 결과적으로 헤더의 JSON 표현은 다음과 같습니다.

{"alg":"RS256","typ":"JWT"}

이에 대한 Base64url 표현은 다음과 같습니다.

eyJhbGciOiJSUzI1NiIsInR5cCI6IkpXVCJ9
JWT 클레임 세트 구성

JWT 클레임 집합에는 요청되는 권한(범위), 토큰 대상, 발급자, 토큰이 발급된 시간 및 토큰 수명을 비롯한 JWT에 대한 정보가 포함되어 있습니다. 대부분의 필드는 필수입니다. JWT 헤더와 마찬가지로 JWT 클레임 세트는 JSON 객체이며 서명 계산에 사용됩니다.

필수 클레임

JWT 클레임 집합의 필수 클레임은 아래와 같습니다. 클레임 집합에서 임의의 순서로 나타날 수 있습니다.

이름 설명
iss 서비스 계정의 이메일 주소입니다.
scope 애플리케이션이 요청하는 권한의 공백으로 구분된 목록입니다.
aud 어설션의 의도된 대상에 대한 설명자입니다. 액세스 토큰 요청을 할 때이 값은 항상 https://oauth2.googleapis.com/token .
exp 어설션의 만료 시간으로 1970년 1월 1일 00:00:00 UTC 이후 초 단위로 지정됩니다. 이 값은 발급된 시간 이후 최대 1시간입니다.
iat 어설션이 발행된 시간으로, 1970년 1월 1일 00:00:00 UTC 이후의 초로 지정됩니다.

JWT 클레임 세트의 필수 필드에 대한 JSON 표현은 다음과 같습니다.

{
  "iss": "761326798069-r5mljlln1rd4lrbhg75efgigp36m78j5@developer.gserviceaccount.com",
  "scope": "https://www.googleapis.com/auth/devstorage.read_only",
  "aud": "https://oauth2.googleapis.com/token",
  "exp": 1328554385,
  "iat": 1328550785
}
추가 클레임

일부 기업의 경우 응용 프로그램은 도메인 전체 위임을 사용하여 조직의 특정 사용자를 대신할 수 있습니다. 이러한 유형의 가장을 수행할 수 있는 권한은 애플리케이션이 사용자를 가장하기 전에 부여되어야 하며 일반적으로 최고 관리자가 처리합니다. 자세한 내용은 도메인 전체 대표단 제어 API에 액세스 .

애플리케이션은 리소스에 액세스 권한을 위임하는 부여 토큰 액세스를 획득하기 위해,의 값과 JWT 클레임 세트 내의 사용자의 이메일 주소를 포함하는 sub 필드.

이름 설명
sub 애플리케이션이 위임된 액세스를 요청하는 사용자의 이메일 주소입니다.

응용 프로그램은 사용자의 포함하는 액세스 토큰 요청에 대한 응답 가장 권한이없는 경우 sub 필드가됩니다 오류가 .

포함 JWT 클레임 세트의 예 sub 필드는 아래에 도시된다 :

{
  "iss": "761326798069-r5mljlln1rd4lrbhg75efgigp36m78j5@developer.gserviceaccount.com",
  "sub": "some.user@example.com",
  "scope": "https://www.googleapis.com/auth/prediction",
  "aud": "https://oauth2.googleapis.com/token",
  "exp": 1328554385,
  "iat": 1328550785
}
JWT 클레임 세트 인코딩

JWT 헤더와 마찬가지로 JWT 클레임 세트는 UTF-8 및 Base64url-safe 인코딩으로 직렬화되어야 합니다. 다음은 JWT 청구 세트의 JSON 표현 예입니다.

{
  "iss": "761326798069-r5mljlln1rd4lrbhg75efgigp36m78j5@developer.gserviceaccount.com",
  "scope": "https://www.googleapis.com/auth/prediction",
  "aud": "https://oauth2.googleapis.com/token",
  "exp": 1328554385,
  "iat": 1328550785
}
서명 계산

JSON 웹 서명 (JWS)는 사양 인 JWT에 대한 서명을 생성의 가이드 메커니즘이. 서명에 대한 입력은 다음 내용의 바이트 배열입니다.

{Base64url encoded header}.{Base64url encoded claim set}

서명을 계산할 때 JWT 헤더의 서명 알고리즘을 사용해야 합니다. Google OAuth 2.0 Authorization Server에서 지원하는 유일한 서명 알고리즘은 SHA-256 해싱 알고리즘을 사용하는 RSA입니다. 이 표현되는 RS256 에서 alg JWT 헤더 필드.

로부터 획득 된 개인 키 (또한, SHA-256 해시 함수 RSASSA-PKCS1-v1_5의 서명으로 알려진)을 사용 SHA256withRSA 입력의 UTF-8로 표현 로그인 Google API Console. 출력은 바이트 배열이 됩니다.

그런 다음 서명은 Base64url로 인코딩되어야 합니다. 헤더 제 세트 및 서명 기간 (함께 연결된다 . ) 문자. 결과는 JWT입니다. 다음과 같아야 합니다(명확성을 위해 줄 바꿈이 추가됨).

{Base64url encoded header}.
{Base64url encoded claim set}.
{Base64url encoded signature}

다음은 Base64url 인코딩 전 JWT의 예입니다.

{"alg":"RS256","typ":"JWT"}.
{
"iss":"761326798069-r5mljlln1rd4lrbhg75efgigp36m78j5@developer.gserviceaccount.com",
"scope":"https://www.googleapis.com/auth/prediction",
"aud":"https://oauth2.googleapis.com/token",
"exp":1328554385,
"iat":1328550785
}.
[signature bytes]

다음은 서명되어 전송할 준비가 된 JWT의 예입니다.

eyJhbGciOiJSUzI1NiIsInR5cCI6IkpXVCJ9.eyJpc3MiOiI3NjEzMjY3OTgwNjktcjVtbGpsbG4xcmQ0bHJiaGc3NWVmZ2lncDM2bTc4ajVAZGV2ZWxvcGVyLmdzZXJ2aWNlYWNjb3VudC5jb20iLCJzY29wZSI6Imh0dHBzOi8vd3d3Lmdvb2dsZWFwaXMuY29tL2F1dGgvcHJlZGljdGlvbiIsImF1ZCI6Imh0dHBzOi8vd3d3Lmdvb2dsZWFwaXMuY29tL29hdXRoMi92NC90b2tlbiIsImV4cCI6MTMyODU1NDM4NSwiaWF0IjoxMzI4NTUwNzg1fQ.UFUt59SUM2_AW4cRU8Y0BYVQsNTo4n7AFsNrqOpYiICDu37vVt-tw38UKzjmUKtcRsLLjrR3gFW3dNDMx_pL9DVjgVHDdYirtrCekUHOYoa1CMR66nxep5q5cBQ4y4u2kIgSvChCTc9pmLLNoIem-ruCecAJYgI9Ks7pTnW1gkOKs0x3YpiLpzplVHAkkHztaXiJdtpBcY1OXyo6jTQCa3Lk2Q3va1dPkh_d--GU2M5flgd8xNBPYw4vxyt0mP59XZlHMpztZt0soSgObf7G3GXArreF_6tpbFsS3z2t5zkEiHuWJXpzcYr5zWTRPDEHsejeBSG8EgpLDce2380ROQ

액세스 토큰 요청하기

서명된 JWT를 생성한 후 애플리케이션은 이를 사용하여 액세스 토큰을 요청할 수 있습니다. 요청 토큰이 액세스는 HTTPS입니다 POST 요청, 몸은 URL 인코딩입니다. URL은 아래와 같습니다.

https://oauth2.googleapis.com/token

다음 매개 변수는 HTTPS에 필요한 POST 요청 :

이름 설명
grant_type 다음 문자열을 사용하여, 필요에 따라 URL을 인코딩 urn:ietf:params:oauth:grant-type:jwt-bearer
assertion 서명을 포함한 JWT.

아래는 HTTPS의 원시 덤프입니다 POST 요청 토큰 액세스에 사용 요청은 :

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

grant_type=urn%3Aietf%3Aparams%3Aoauth%3Agrant-type%3Ajwt-bearer&assertion=eyJhbGciOiJSUzI1NiIsInR5cCI6IkpXVCJ9.eyJpc3MiOiI3NjEzMjY3OTgwNjktcjVtbGpsbG4xcmQ0bHJiaGc3NWVmZ2lncDM2bTc4ajVAZGV2ZWxvcGVyLmdzZXJ2aWNlYWNjb3VudC5jb20iLCJzY29wZSI6Imh0dHBzOi8vd3d3Lmdvb2dsZWFwaXMuY29tL2F1dGgvcHJlZGljdGlvbiIsImF1ZCI6Imh0dHBzOi8vYWNjb3VudHMuZ29vZ2xlLmNvbS9vL29hdXRoMi90b2tlbiIsImV4cCI6MTMyODU3MzM4MSwiaWF0IjoxMzI4NTY5NzgxfQ.ixOUGehweEVX_UKXv5BbbwVEdcz6AYS-6uQV6fGorGKrHf3LIJnyREw9evE-gs2bmMaQI5_UbabvI4k-mQE4kBqtmSpTzxYBL1TCd7Kv5nTZoUC1CmwmWCFqT9RE6D7XSgPUh_jF1qskLa2w0rxMSjwruNKbysgRNctZPln7cqQ

아래 사용하여 동일한 요청입니다 curl :

curl -d 'grant_type=urn%3Aietf%3Aparams%3Aoauth%3Agrant-type%3Ajwt-bearer&assertion=eyJhbGciOiJSUzI1NiIsInR5cCI6IkpXVCJ9.eyJpc3MiOiI3NjEzMjY3OTgwNjktcjVtbGpsbG4xcmQ0bHJiaGc3NWVmZ2lncDM2bTc4ajVAZGV2ZWxvcGVyLmdzZXJ2aWNlYWNjb3VudC5jb20iLCJzY29wZSI6Imh0dHBzOi8vd3d3Lmdvb2dsZWFwaXMuY29tL2F1dGgvcHJlZGljdGlvbiIsImF1ZCI6Imh0dHBzOi8vYWNjb3VudHMuZ29vZ2xlLmNvbS9vL29hdXRoMi90b2tlbiIsImV4cCI6MTMyODU3MzM4MSwiaWF0IjoxMzI4NTY5NzgxfQ.RZVpzWygMLuL-n3GwjW1_yhQhrqDacyvaXkuf8HcJl8EtXYjGjMaW5oiM5cgAaIorrqgYlp4DPF_GuncFqg9uDZrx7pMmCZ_yHfxhSCXru3gbXrZvAIicNQZMFxrEEn4REVuq7DjkTMyCMGCY1dpMa8aWfTQFt3Eh7smLchaZsU
' https://oauth2.googleapis.com/token

응답 처리

JWT 및 액세스 토큰 요청이 올바르게 구성되고 서비스 계정에 작업을 수행할 수 있는 권한이 있으면 Authorization Server의 JSON 응답에 액세스 토큰이 포함됩니다. 다음은 응답의 예입니다.

{
  "access_token": "1/8xbJqaOZXSUZbHLl5EOtu1pxz3fmmetKx9W8CV4t79M",
  "scope": "https://www.googleapis.com/auth/prediction"
  "token_type": "Bearer",
  "expires_in": 3600
}

액세스 토큰은에 의해 지정된 기간 기간 동안 재사용 할 수 expires_in 값입니다.

Google API 호출

자바

사용 GoogleCredential 다음 단계를 완료하여 구글 API를 호출하는 객체를 :

  1. 당신이 사용하여 전화를 걸하는 API에 대한 서비스 객체 생성 GoogleCredential 개체를. 예를 들면 다음과 같습니다
    SQLAdmin sqladmin =
        new SQLAdmin.Builder(httpTransport, JSON_FACTORY, credential).build();
  2. 사용하여 API 서비스에 대한 요청을 확인 서비스 객체가 제공하는 인터페이스를 . 예를 들어, 흥미 진진한 - 예를-123 프로젝트에 클라우드 SQL 데이터베이스 인스턴스를 나열
    SQLAdmin.Instances.List instances =
        sqladmin.instances().list("exciting-example-123").execute();

파이썬

인증 된 사용 Credentials 다음 단계를 완료하여 구글 API를 호출하는 객체 :

  1. 호출하려는 API에 대한 서비스 개체를 빌드합니다. 당신은 호출하여 AA 서비스 개체를 구축 build 이름과 API의 버전 및 권한과 기능 Credentials 개체를. 예를 들어, 클라우드 SQL 관리 API의 버전 1beta3를 호출 :
    import googleapiclient.discovery
    
    sqladmin = googleapiclient.discovery.build('sqladmin', 'v1beta3', credentials=credentials)
  2. 사용하여 API 서비스에 대한 요청을 확인 서비스 객체가 제공하는 인터페이스를 . 예를 들어, 흥미 진진한 - 예를-123 프로젝트에 클라우드 SQL 데이터베이스 인스턴스를 나열
    response = sqladmin.instances().list(project='exciting-example-123').execute()

HTTP/휴식

애플리케이션이 액세스 토큰을 얻은 후 API에 필요한 액세스 범위가 부여된 경우 토큰을 사용하여 지정된 서비스 계정 또는 사용자 계정을 대신하여 Google API를 호출할 수 있습니다. 이렇게하려면 중 하나를 포함하여 API에 요청에 액세스 토큰이 포함 access_token 쿼리 매개 변수 또는 Authorization HTTP 헤더 Bearer 값입니다. 쿼리 문자열이 서버 로그에 표시되는 경향이 있기 때문에 가능하면 HTTP 헤더를 사용하는 것이 좋습니다. 대부분의 경우 구글 API에 통화를 설정하는 클라이언트 라이브러리를 사용할 수 있습니다 (예를 들어, 드라이브 파일 API를 호출 ).

당신은 모든 구글 API를 시도하고 그들의 범위를 볼 수 OAuth는 2.0 놀이터 .

HTTP GET 예제

받는 호출 drive.files 엔드 포인트 (드라이브 파일 API)를 사용하여 Authorization: Bearer HTTP 헤더는 다음과 같이 보일 수 있습니다. 고유한 액세스 토큰을 지정해야 합니다.

GET /drive/v2/files HTTP/1.1
Host: www.googleapis.com
Authorization: Bearer access_token

여기에 사용하여 인증 된 사용자에 대해 동일한 API를 호출입니다 access_token 쿼리 문자열 매개 변수 :

GET https://www.googleapis.com/drive/v2/files?access_token=access_token

curl

당신은 이러한 명령을 테스트 할 수 있습니다 curl 명령 줄 응용 프로그램을. 다음은 HTTP 헤더 옵션(선호)을 사용하는 예입니다.

curl -H "Authorization: Bearer access_token" https://www.googleapis.com/drive/v2/files

또는 쿼리 문자열 매개변수 옵션:

curl https://www.googleapis.com/drive/v2/files?access_token=access_token

액세스 토큰이 만료되는 경우

액세스는에 의해 제공 기간 이후에 만료 구글의 OAuth 2.0 인증 서버에서 발급 한 토큰 expires_in 값입니다. 액세스 토큰이 만료되면 애플리케이션은 다른 JWT를 생성하고 서명한 다음 다른 액세스 토큰을 요청해야 합니다.

JWT 오류 코드

error 필드 error_description 필드 의미 해결 방법
unauthorized_client Unauthorized client or scope in request. 도메인 전체 위임을 사용하려는 경우 사용자 도메인의 관리 콘솔에서 서비스 계정이 승인되지 않은 것입니다.

서비스 계정이 허가되어 있는지 확인 도메인 전체에 위임 에서 사용자에 대한 관리 콘솔의 페이지 sub 주장 (필드).

일반적으로 몇 분 정도 걸리지만 승인이 Google 계정의 모든 사용자에게 전파되는 데 최대 24시간이 걸릴 수 있습니다.

unauthorized_client Client is unauthorized to retrieve access tokens using this method, or client not authorized for any of the scopes requested. 관리 콘솔에서 클라이언트 ID(숫자)가 아닌 클라이언트 이메일 주소를 사용하여 서비스 계정이 승인되었습니다. 에서 도메인 전체의 위임 관리 콘솔 페이지, 클라이언트를 제거하고 숫자 ID와 함께 재 추가합니다.
access_denied (모든 값) 도메인 전체 위임을 사용하는 경우 하나 이상의 요청된 범위가 관리 콘솔에서 승인되지 않습니다.

서비스 계정이 허가되어 있는지 확인 도메인 전체에 위임 에서 사용자에 대한 관리 콘솔의 페이지 sub 주장 (필드), 그리고 그것을 포함하는 모든 당신이에서 요청하는 스코프 scope 당신의 JWT의 주장.

일반적으로 몇 분 정도 걸리지만 승인이 Google 계정의 모든 사용자에게 전파되는 데 최대 24시간이 걸릴 수 있습니다.

invalid_grant Not a valid email. 사용자가 존재하지 않습니다. 의 이메일 주소 있는지 확인 sub 주장 (필드) 맞습니다.
invalid_grant

Invalid JWT: Token must be a short-lived token (60 minutes) and in a reasonable timeframe. Check your 'iat' and 'exp' values and use a clock with skew to account for clock differences between systems.

일반적으로 로컬 시스템 시간이 정확하지 않음을 의미합니다. 경우에도 일어날 수있는 exp 값이에서 향후 65 개 이상의 분입니다 iat 값, 또는 exp 값보다 낮은 iat 값.

JWT가 생성된 시스템의 시계가 올바른지 확인하십시오. 필요한 경우와 시간 동기화 구글 NTP를 .

invalid_grant Invalid JWT Signature.

JWT 어설션은 클라이언트 이메일로 식별된 서비스 계정과 연결되지 않은 개인 키로 서명되었거나 사용된 키가 삭제, 비활성화 또는 만료되었습니다.

또는 JWT 어설션이 잘못 인코딩될 수 있습니다. 새 줄이나 패딩 등호 없이 Base64로 인코딩되어야 합니다.

JWT 클레임 세트를 디코딩하고 어설션에 서명한 키가 서비스 계정과 연결되어 있는지 확인합니다.

Google에서 제공하는 OAuth 라이브러리를 사용하여 JWT가 올바르게 생성되었는지 확인하십시오.

invalid_scope Invalid OAuth scope or ID token audience provided. 범위가 요청되지 않았거나(빈 범위 목록) 요청된 범위 중 하나가 존재하지 않습니다(즉, 유효하지 않음).

있는지 확인 scope JWT의 주장 (필드) 채워집니다 및 오류 또는 오타가 없는지 확인하기 위해, 당신이 사용하고자하는 API에 대한 문서화 된 범위에 포함 된 범위를 비교합니다.

의 범위 목록 참고 scope 제 요구가 공백으로 분리 할 수는 없다 쉼표.

disabled_client The OAuth client was disabled. JWT 어설션에 서명하는 데 사용된 키가 비활성화되었습니다.

로 이동 Google API ConsoleIAM 및 관리> 서비스 계정 아래의 주장을 서명하는 데 사용되는 "키 ID"를 포함하는 서비스 계정을 활성화합니다.

부록: OAuth가 없는 서비스 계정 승인

일부 Google API에서는 서명된 JWT를 OAuth 2.0 액세스 토큰이 아닌 전달자 토큰으로 직접 사용하여 승인된 API 호출을 수행할 수 있습니다. 이것이 가능하면 API를 호출하기 전에 Google의 인증 서버에 네트워크 요청을 하지 않아도 됩니다.

통화 할 API가에 발표 된 서비스 정의가있는 경우 구글 API를 GitHub의 저장소를 , 당신은 JWT 대신에의 액세스 토큰을 사용하여 인증 된 API 통화를 할 수 있습니다. 이렇게 하려면:

  1. 서비스 계정 만들기 상기 한 바와 같이. 계정을 생성할 때 받은 JSON 파일을 보관하십시오.
  2. 에서 발견 한 같은 표준 JWT 라이브러리를 사용 jwt.io이 : 다음 예와 같이 헤더와 페이로드와 JWT 만들
    {
      "alg": "RS256",
      "typ": "JWT",
      "kid": "abcdef1234567890"
    }
    .
    {
      "iss": "123456-compute@developer.gserviceaccount.com",
      "sub": "123456-compute@developer.gserviceaccount.com",
      "aud": "https://firestore.googleapis.com/",
      "iat": 1511900000,
      "exp": 1511903600
    }
    • 를 들어 kid 헤더 필드, 서비스 계정의 개인 키의 ID를 지정합니다. 당신은이 값 찾을 수 있습니다 private_key_id 서비스 계정 JSON 파일의 필드.
    • 를 들어 isssub 필드 서비스 계정의 이메일 주소를 지정합니다. 당신은이 값 찾을 수 있습니다 client_email 서비스 계정 JSON 파일의 필드.
    • 위해 aud 필드에 API 엔드 포인트를 지정합니다. 예를 들면 : https:// SERVICE .googleapis.com/ .
    • 를 들어 iat 필드, 현재 유닉스 시간을 지정하고 대한 exp JWT가 만료 될 때 필드, 정확히 3,600초 후, 시간을 지정합니다.

서비스 계정 JSON 파일에 있는 개인 키를 사용하여 RSA-256으로 JWT에 서명합니다.

예를 들어:

자바

사용 구글-API - 자바 클라이언트자바 JWT를 :

GoogleCredential credential =
        GoogleCredential.fromStream(new FileInputStream("MyProject-1234.json"));
PrivateKey privateKey = credential.getServiceAccountPrivateKey();
String privateKeyId = credential.getServiceAccountPrivateKeyId();

long now = System.currentTimeMillis();

try {
    Algorithm algorithm = Algorithm.RSA256(null, privateKey);
    String signedJwt = JWT.create()
        .withKeyId(privateKeyId)
        .withIssuer("123456-compute@developer.gserviceaccount.com")
        .withSubject("123456-compute@developer.gserviceaccount.com")
        .withAudience("https://firestore.googleapis.com/")
        .withIssuedAt(new Date(now))
        .withExpiresAt(new Date(now + 3600 * 1000L))
        .sign(algorithm);
} catch ...

파이썬

사용 PyJWT를 :

iat = time.time()
exp = iat + 3600
payload = {'iss': '123456-compute@developer.gserviceaccount.com',
           'sub': '123456-compute@developer.gserviceaccount.com',
           'aud': 'https://firestore.googleapis.com/',
           'iat': iat,
           'exp': exp}
additional_headers = {'kid': PRIVATE_KEY_ID_FROM_JSON}
signed_jwt = jwt.encode(payload, PRIVATE_KEY_FROM_JSON, headers=additional_headers,
                       algorithm='RS256')
  1. 베어러는 토큰으로 서명 JWT를 사용하여 API를 호출 :
    GET /v1/projects/abc/databases/123/indexes HTTP/1.1
    Authorization: Bearer SIGNED_JWT
    Host: firestore.googleapis.com