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

Google OAuth 2.0 시스템은 웹 서버 간 상호작용과 같은 서버 간 상호작용을 지원합니다. 애플리케이션 및 Google 서비스입니다 이 시나리오에서는 서비스 계정이 필요합니다. 은 개별 최종 사용자가 아니라 애플리케이션에 속한 계정입니다. 내 애플리케이션이 서비스 계정을 대신하여 Google API를 호출하므로 있습니다. 이 시나리오를 '2-legged OAuth'라고도 합니다. 또는 '2LO'입니다. (관련 용어 '3-legged OAuth' 애플리케이션이 대신하여 Google API를 호출하는 시나리오를 말합니다. 경우에 따라 사용자 동의가 필요한 경우도 있습니다.)

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

Google Workspace 도메인 관리자는 다음 작업도 할 수 있습니다. 서비스 계정에 도메인 전체 권한을 부여하여 사용자 액세스 권한을 부여합니다. 데이터를 위임할 수 있습니다.

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

개요

서버 간 상호작용을 지원하려면 먼저 API Console Google Workspace 계정에 로그인한 후 서비스 계정에 도메인 전체 액세스 권한을 위임할 수 있습니다.

그러면 애플리케이션에서 서비스 계정의 사용자 인증 정보를 사용하여 OAuth 2.0 인증 서버에서 액세스 토큰을 요청합니다.

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

서비스 계정 만들기

서비스 계정의 사용자 인증 정보에는 최소한 한 개의 공개 키/비공개 키 쌍입니다. 도메인 전체 위임이 사용 설정된 경우 클라이언트 ID도 사용자 인증 정보를 제공합니다

애플리케이션이 Google App Engine에서 실행되는 경우 확인할 수 있습니다

애플리케이션이 Google Compute Engine에서 실행되는 경우 서비스 계정도 설정됩니다. 자동으로 추가되긴 하지만 가져올 범위를 지정해야 합니다. 액세스 권한이 필요한 모든 애플리케이션에 액세스할 수 있는 권한을 부여합니다 자세한 내용은 자세한 내용은 서비스 계정을 사용할 인스턴스 준비

애플리케이션이 Google App Engine 또는 Google Compute Engine에서 실행되지 않는 경우 Google API Console에서 이 사용자 인증 정보를 가져옵니다. 서비스 계정 생성 사용자 인증 정보를 확인하거나, 이미 생성한 공개 사용자 인증 정보를 보려면 다음 단계를 따르세요.

먼저 서비스 계정을 만듭니다.

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

다음으로 서비스 계정 키를 만듭니다.

  1. 생성한 서비스 계정의 이메일 주소를 클릭합니다.
  2. 탭을 클릭합니다.
  3. 키 추가 드롭다운 목록에서 새 키 만들기 를 선택합니다.
  4. 만들기 를 클릭합니다.

새로운 공개/개인 키 쌍이 생성되어 컴퓨터에 다운로드됩니다. 개인 키의 유일한 복사본 역할을 합니다. 안전하게 보관할 책임은 귀하에게 있습니다. 이 키 쌍을 분실하면 새 키 쌍을 생성해야 합니다.

(으)로 돌아갈 수 있습니다. API Console 언제든지 공개 이메일 주소를 볼 수 있습니다. 키 지문 및 기타 정보를 포함하거나, 추가 공개/비공개 키 쌍을 생성할 수 있습니다. 대상 서비스 계정 사용자 인증 정보에 대한 자세한 내용은 API Console, 다음을 참고하세요. API Console의 서비스 계정 help file.

서비스 계정의 이메일 주소를 기록하고 서비스 계정의 비공개 키를 저장 해당 파일을 애플리케이션에서 액세스할 수 있는 위치에 저장해야 합니다. 애플리케이션에서는 API 호출을 확인할 수 있습니다

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

조직의 Workspace 관리자는 Google Workspace 계정을 사용하여 Google Workspace 도메인의 사용자를 대신하여 Workspace 사용자 데이터에 액세스할 수 있는 애플리케이션 예를 들어 Google Calendar API를 사용하여 Google Workspace 도메인은 서비스 계정을 사용하여 사용자를 대신하여 실행할 수 있습니다 도메인 사용자를 대신하여 서비스 계정이 데이터에 액세스하도록 승인하는 것은 '도메인 전체 권한 위임'이라고도 함 서비스 계정에 연결할 수 있습니다

도메인 전체 권한을 서비스 계정에 위임하려면 Workspace 도메인이 다음 단계를 완료해야 합니다.

  1. Google Workspace 도메인의 에서 가져옴 관리 콘솔에서 기본 메뉴로 이동합니다. > 보안 > 액세스 및 데이터 관리 > API 관리를 참조하세요.
  2. 도메인 전체 위임 창에서 도메인 전체 위임 관리를 선택합니다.
  3. 새로 추가를 클릭합니다.
  4. 클라이언트 ID 입력란에 서비스 계정의 클라이언트 ID를 입력합니다. 다음에서 확인할 수 있습니다. 서비스 계정의 클라이언트 ID를 Service accounts page
  5. OAuth 범위 (쉼표로 분리) 입력란에 애플리케이션에 액세스 권한을 부여해야 합니다. 예를 들어 애플리케이션에 도메인 전체의 Google Drive API 및 Google Calendar API에 대한 전체 액세스 권한을 부여하려면 다음을 입력하세요. https://www.googleapis.com/auth/drive, https://www.googleapis.com/auth/calendar.
  6. 승인을 클릭합니다.

이제 애플리케이션은 Workspace 도메인( '가장' 있습니다. 이러한 위임된 API 호출을 준비할 때 있습니다.

위임된 API 호출 준비

자바

Google 관리 콘솔에서 클라이언트 이메일 주소와 비공개 키를 API Console인 경우 Java용 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));

Google Cloud Platform에서 앱을 개발하는 경우 애플리케이션 기본 사용자 인증 정보 프로세스를 간소화할 수 있습니다

도메인 전체 권한 위임

서비스 계정에 도메인 전체 액세스 권한을 위임한 경우 사용자 계정을 만들고 싶다면 GoogleCredential 객체의 createDelegated 메서드 예:

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

위 코드는 GoogleCredential 객체를 사용하여 createDelegated()를 호출합니다. 메서드를 사용하여 축소하도록 요청합니다. createDelegated() 메서드의 인수는 Workspace 계정 요청하는 코드는 이 사용자 인증 정보를 사용하여 Google을 호출합니다. 직접 액세스할 수 있습니다

Python

Google 관리 콘솔에서 클라이언트 이메일 주소와 비공개 키를 API Console인 경우 Python용 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)

    Google Cloud Platform에서 앱을 개발하는 경우 애플리케이션 기본 사용자 인증 정보 프로세스를 간소화할 수 있습니다

  2. 도메인 전체 권한 위임

    서비스 계정에 도메인 전체 액세스 권한을 위임했으며 사용자 계정을 가장하려면 with_subject 메서드를 사용하여 ServiceAccountCredentials 객체. 예를 들면 다음과 같습니다.

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

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

HTTP/REST

서버에서 클라이언트 ID와 비공개 키를 API Console님, 애플리케이션에서 다음을 완료해야 합니다. 다음 단계를 따르세요.

  1. 헤더, 클레임 세트, 서명이 있습니다
  2. Google OAuth 2.0 승인 서버에서 액세스 토큰을 요청합니다.
  3. 승인 서버가 반환하는 JSON 응답을 처리합니다.

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

응답에 액세스 토큰이 포함된 경우 액세스 토큰을 사용하여 Google API 호출 (응답에 JWT 및 토큰 요청의 형식이 올바르지 않거나 서비스 계정이 요청된 범위에 액세스할 권한이 없습니다.)

액세스 토큰이 만료되면 애플리케이션에서 또 다른 JWT로 보내고, 서명하고, 다른 액세스 토큰을 요청합니다.

서버 애플리케이션은 JWT를 사용하여 Google
                  그런 다음 토큰을 사용하여 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 헤더 작성

헤더는 서명 알고리즘, 어설션, [서비스 계정의 키 ID] key](https://cloud.google.com/iam/docs/reference/rest/v1/projects.serviceAccounts.keys) JWT를 서명하는 데 사용되었습니다 알고리즘과 형식은 필수이며 각 입력란에는 값이 1개여야 합니다. 추가 알고리즘과 형식이 도입되면 이 헤더는 변경됩니다. 변경할 수 있습니다 키 ID는 선택사항이며 잘못된 키 ID가 지정되면 GCP에서 시도합니다. 토큰을 확인하고 서비스 계정에 연결된 모든 키를 가져와서 거부 유효한 키가 없습니다. Google은 잘못된 키 ID가 포함된 토큰을 거부할 권리를 보유합니다. 있습니다.

서비스 계정은 RSA SHA-256 알고리즘 및 JWT 토큰 형식을 사용합니다. 그 결과 헤더의 JSON 표현은 다음과 같습니다.

{"alg":"RS256","typ":"JWT", "kid":"370ab79b4513eb9bad7c9bd16a95cb76b5b2a56a"}

Base64url 표현은 다음과 같습니다.

          eyJhbGciOiJSUzI1NiIsInR5cCI6IkpXVCIsICJraWQiOiIzNzBhYjc5YjQ1MTNlYjliYWQ3YzliZDE2YTk1Y2I3NmI1YjJhNTZhIn0=
JWT 클레임 세트 형성

JWT 클레임 세트에는 사용 중인 권한 등 JWT에 대한 정보가 들어 있습니다. 토큰의 대상, 발급자, 토큰이 발급된 시간, 토큰의 수명을 나타냅니다. 대부분의 입력란은 필수입니다. JWT 헤더와 마찬가지로 JWT 클레임 세트는 JSON 객체이며 서명 계산에 사용됩니다.

필수 클레임

JWT 클레임 집합의 필수 클레임은 아래와 같습니다. 순서와 상관없이 표시될 수 있습니다. 확인할 수 있습니다

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

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 필드가 포함된 액세스 토큰 요청은 오류가 반환됩니다.

sub 필드가 포함된 JWT 클레임 집합의 예가 나와 있습니다. 아래:

{
  "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(JWS)는 JWT입니다. 서명 입력은 다음 콘텐츠의 바이트 배열입니다.

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

서명을 계산할 때는 JWT 헤더의 서명 알고리즘을 사용해야 합니다. 이 Google OAuth 2.0 승인 서버에서 지원하는 서명 알고리즘은 SHA-256 해싱 알고리즘. 이는 alg에서 RS256로 표현됩니다. 필드를 설정할 수 있습니다.

SHA256withRSA( RSASSA-PKCS1-V1_5-SIGN(SHA-256 해시 함수 포함) 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 및 액세스 토큰 요청의 형식이 올바르고 서비스 계정에 작업을 수행할 수 있는 권한이 있어야만 승인 서버의 JSON 응답이 액세스 토큰이 포함됩니다 다음은 응답 예시입니다.

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

액세스 토큰은 expires_in 값입니다.

Google API 호출

자바

GoogleCredential 객체를 사용하여 다음 단계를 따르세요.

  1. 호출하려는 API에 대한 서비스 객체를 만듭니다. GoogleCredential 객체. 예를 들면 다음과 같습니다.
    SQLAdmin sqladmin =
        new SQLAdmin.Builder(httpTransport, JSON_FACTORY, credential).build();
  2. 다음을 사용하여 API 서비스에 요청합니다. 서비스 객체에서 제공하는 인터페이스를 참조하세요. 예를 들어 'learn'-example-123'에 Cloud SQL 데이터베이스의 인스턴스를 나열하는 방법은 다음과 같습니다. 프로젝트:
    SQLAdmin.Instances.List instances =
        sqladmin.instances().list("exciting-example-123").execute();

Python

승인된 Credentials 객체를 사용하여 다음을 완료하여 Google API를 호출합니다. 다음 단계를 따르세요.

  1. 호출하려는 API의 서비스 객체를 빌드합니다. 서비스 객체 빌드 API의 이름 및 버전과 함께 build 함수를 호출하여 Credentials 객체를 승인합니다. 예를 들어, Cloud SQL Administration API:
    import googleapiclient.discovery
    
    sqladmin = googleapiclient.discovery.build('sqladmin', 'v1beta3', credentials=credentials)
  2. 다음을 사용하여 API 서비스에 요청합니다. 서비스 객체에서 제공하는 인터페이스를 참조하세요. 예를 들어 XXX-example-123에 Cloud SQL 데이터베이스의 인스턴스를 나열하려면 프로젝트:
    response = sqladmin.instances().list(project='exciting-example-123').execute()

HTTP/REST

애플리케이션이 액세스 토큰을 획득한 후에는 이 토큰을 사용하여 Google Cloud 콘솔 특정 서비스 계정을 대신하여 API 액세스 권한을 부여하거나 API에서 요구하는 액세스 범위가 부여된 경우 사용자 계정이 생성됩니다. 이렇게 하려면 access_token 쿼리 중 하나를 포함하여 API에 대한 요청에 액세스 토큰 생성 매개변수 또는 Authorization HTTP 헤더 Bearer 값을 사용해야 합니다. 가능하면 쿼리 문자열은 서버 로그에 표시되는 경향이 있으므로 HTTP 헤더를 사용하는 것이 좋습니다. 최대 클라이언트 라이브러리를 사용하여 Google API에 대한 호출을 설정할 수 있는 경우 (예: Drive Files API 호출).

모든 Google API를 사용해 보고 OAuth 2.0 플레이그라운드.

HTTP GET 예시

호출 <ph type="x-smartling-placeholder"></ph> drive.files 엔드포인트 (Drive Files API)는 Authorization: Bearer HTTP를 사용하는 헤더는 다음과 같을 수 있습니다. 자체 액세스 토큰을 지정해야 합니다.

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

다음은 access_token를 사용하여 인증된 사용자의 동일한 API를 호출합니다. 쿼리 문자열 매개변수:

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

curl

curl 명령줄 애플리케이션을 사용하여 이러한 명령어를 테스트할 수 있습니다. 다음은 예를 들면 다음과 같습니다 (권장).

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

액세스 토큰 만료 시

Google OAuth 2.0 인증 서버에서 발급한 액세스 토큰은 이 기간 후 만료됩니다. expires_in 값으로 제공됨 액세스 토큰이 만료되면 다른 JWT를 생성하여 서명하고 다른 액세스 토큰을 요청해야 합니다.

JWT 오류 코드

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

서비스 계정이 <ph type="x-smartling-placeholder"></ph> 도메인 전체 위임 페이지가 표시됩니다. sub 소유권 주장 (필드).

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

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 (모든 값) 도메인 전체 위임을 사용하는 경우 요청된 범위 중 하나 이상이 승인되지 않았습니다. 관리할 수 있습니다.

서비스 계정이 <ph type="x-smartling-placeholder"></ph> 도메인 전체 위임 페이지가 표시됩니다. sub 소유권 주장 (필드) 및 요청하는 모든 범위가 포함되어 있는지 확인 JWT의 scope 클레임에 포함되어야 합니다.

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

admin_policy_enforced (모든 값) 다음과 같은 이유로 요청된 하나 이상의 범위를 Google 계정에서 승인할 수 없습니다. Google Workspace 관리자의 정책

Google Workspace 관리자 도움말 보기 어떤 서드 파티 및 Google Workspace 데이터에 액세스하는 방법을 자세히 알아보세요. 관리자는 다음 날짜까지 모든 범위 또는 민감하고 제한된 범위에 대한 액세스를 제한할 수 있습니다. 액세스 권한이 OAuth 클라이언트 ID에 명시적으로 부여됩니다.

invalid_client (모든 값)

OAuth 클라이언트 또는 JWT 토큰이 잘못되었거나 잘못 구성되었습니다.

자세한 내용은 오류 설명을 참고하세요.

JWT 토큰이 유효하고 올바른 클레임이 포함되어 있는지 확인하세요.

OAuth 클라이언트 및 서비스 계정이 올바르게 구성되어 있고 올바른 이메일 주소를 사용하고 있는지 확인하세요.

JWT 토큰이 올바르고 합니다.

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 값이 iat 값에서 향후 65분 이상입니다. 또는 exp 값이 iat 값보다 작은 경우

JWT가 생성된 시스템의 시계가 올바른지 확인합니다. 만약 필요한 경우 Google NTP

invalid_grant Invalid JWT Signature.

JWT 어설션이 서비스 계정과 연결되지 않은 비공개 키로 서명되었습니다. 삭제된 키 또는 키에서 사용 중지된 키가 삭제 또는 사용 중지되었거나 만료되었습니다.

또는 JWT 어설션이 잘못 인코딩되었을 수 있습니다. 줄바꿈이나 패딩 등호 없이 Base64로 인코딩됩니다.

JWT 클레임 집합을 디코딩하고 어설션을 서명한 키가 연결되어 있는지 확인 연결할 수 있습니다

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

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

JWT의 scope 클레임 (필드)이 채워졌는지 확인하고 비교하세요. 사용하려는 API의 문서화된 범위와 함께 포함되는 범위 오류나 오타가 없는지 확인합니다

scope 클레임의 범위 목록은 공백 사용 시 쉼표가 아닌 공백을 사용할 수 있습니다.

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

Google API Console으로 이동한 다음 IAM 및 관리 &gt; 서비스 계정에서 '키 ID'가 포함된 서비스 계정을 사용 설정합니다. 사용됨 어설션에 서명합니다.

org_internal This client is restricted to users within its organization. 요청의 OAuth 클라이언트 ID가 Google에 대한 액세스를 제한하는 프로젝트의 일부입니다. 특정 <ph type="x-smartling-placeholder"></ph> Google Cloud 조직.

조직의 서비스 계정을 사용하여 인증합니다. 사용자 유형 설정을 구성합니다.

부록: OAuth를 사용하지 않는 서비스 계정 승인

일부 Google API에서는 서명된 JWT를 Bearer 토큰을 사용할 수 있습니다. 이럴 때는 이 API를 호출하기 전에 Google 인증 서버에 네트워크 요청을 만듭니다.

호출하려는 API에 Google API GitHub 저장소, 액세스 토큰 대신 JWT를 사용하여 승인된 API 호출을 수행할 수 있습니다. 방법은 다음과 같습니다.

  1. 위에서 설명한 대로 서비스 계정을 만듭니다. 반드시 계정을 만들 때 받은 JSON 파일을 보관하세요.
  2. 다음 위치에 있는 것과 같은 표준 JWT 라이브러리 사용 jwt.io: 헤더가 있는 JWT 만들기 페이로드가 포함되어 있습니다. <ph type="x-smartling-placeholder">
    {
      "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
    }
    </ph>
    • 헤더의 kid 필드에 서비스 계정의 비공개 키를 지정합니다. 있습니다. 서비스 계정의 private_key_id 필드에서 이 값을 찾을 수 있습니다. JSON 파일입니다.
    • isssub 필드에 서비스 계정의 이메일을 지정합니다. 있습니다. 서비스의 client_email 필드에서 이 값을 찾을 수 있습니다. 계정 JSON 파일로 이동하겠습니다.
    • aud 필드에 API 엔드포인트를 지정합니다. 예를 들면 https://SERVICE.googleapis.com/입니다.
    • iat 필드에 현재 Unix 시간을 지정하고 exp 필드: JWT가 실행할 정확히 3,600초 후의 시간을 지정합니다. 만료됩니다.

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

예를 들면 다음과 같습니다.

자바

사용 google-api-java-clientjava-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 ...

Python

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를 Bearer 토큰으로 사용하여 API를 호출합니다.
    GET /v1/projects/abc/databases/123/indexes HTTP/1.1
    Authorization: Bearer SIGNED_JWT
    Host: firestore.googleapis.com

계정 간 보안 구현

사용자의 개인 정보를 보호하기 위해 취해야 할 추가 조치 여러 계정에서 교차 계정 구현 중 Google의 계정 간 보안 서비스를 활용하여 보호합니다. 이 서비스를 사용하면 보안 관련 활동에 대한 정보를 애플리케이션에 제공하는 사용자 계정에 큰 변화가 있을 수 있습니다. 그런 다음 이러한 정보를 활용하여 이벤트에 대한 응답 방법을 결정하는 것입니다.

다음은 Google 계정 간 보안 서비스에서 앱에 전송하는 이벤트 유형의 예입니다.

  • https://schemas.openid.net/secevent/risc/event-type/sessions-revoked
  • https://schemas.openid.net/secevent/oauth/event-type/token-revoked
  • https://schemas.openid.net/secevent/risc/event-type/account-disabled

자세한 내용은 <ph type="x-smartling-placeholder"></ph> 계정 간 보안 페이지에서 사용자 계정 보호하기 를 통해 개인정보처리방침을 정의할 수 있습니다. 에서 교차 계정 보호를 구현하는 방법을 자세히 알아보고 사용 가능한 이벤트의 전체 목록을 확인하세요.