승인 및 확인

처리 엔드포인트에 대한 결제 및 주문 제출 요청이 Google에서 발생했는지 확인하고 승인되지 않은 서드 파티가 엔드포인트를 호출하지 못하도록 하려면 요청 메시지 인증을 구현하세요.

JWT를 사용한 메시지 확인

주문 엔드 투 엔드 서버에서 발신되는 처리 엔드포인트의 요청에는 보안을 위해 Authorization 헤더에 서명된 JSON 웹 토큰 (JWT)이 포함됩니다. 토큰은 Google과 처리 엔드포인트 구현에서 모두 호출할 수 있는 공유 인증 서비스에서 생성됩니다.

  1. Google은 승인 서비스와 음식 주문 프로젝트의 프로젝트 ID를 사용하여 서명된 JWT를 생성합니다.
  2. Google은 모든 요청의 Authorization 헤더에 서명된 토큰을 처리 엔드포인트로 전송합니다.
  3. 엔드포인트는 Google 인증 라이브러리를 사용하여 서명된 토큰을 디코딩해야 합니다. 디코딩된 토큰에는 프로젝트 ID, 발급기관, 만료 시간, 발급 시간과 같은 세부정보가 포함됩니다. 이 데이터를 사용하여 요청의 진위를 확인합니다.

프로젝트에 요청 확인을 구현하려면 다음 단계를 따르세요.

  1. 수신 요청의 Authorization 헤더에서 JWT를 추출합니다.
  2. Google 인증 라이브러리를 사용하여 토큰을 디코딩합니다.
  3. 토큰의 audience를 프로젝트 ID로 설정합니다.
  4. 토큰 페이로드에 포함된 발급자, 프로젝트 ID, 기타 정보가 정확한지 확인합니다.

Google 승인 라이브러리

주문 엔드 투 엔드의 메시지를 확인하고 웹 서비스에서 Google로 전송하는 메시지의 승인 코드를 생성하려면 원하는 프로그래밍 언어로 Google 인증 라이브러리를 사용하세요.

이러한 라이브러리 중 하나를 다운로드하여 웹 서비스 구현 코드에 추가합니다.

인증 요청 예시

다음 예는 요청 확인을 구현하는 방법을 보여줍니다.

Node.js

const auth = require('google-auth-library')
const authClient = new auth.OAuth2Client()

/**
 * Verifies that an incoming request came from Google.
 * @param {String} idToken - The ID token used to verify the request
 * (i.e. The value found in the Authorization header of an incoming request).
 * @param {String} audience - The expected audience of the request
 * (i.e. The project ID for your project).
 * @return {boolean} True if request came from Google, false otherwise.
 */
function isRequestFromGoogle(idToken, audience) {
  authClient.verifyIdToken({idToken, audience}, (err, info) => {
    return !(err || info['iss'] !== 'https://accounts.google.com')
  })
}
    

Python

from google.oauth2 import id_token
from google.auth.transport import requests

def isRequestFromGoogle(audience, token):
    """ Verifies that an incoming request came from Google.

    Args:
        audience (str): The expected audience of the request
                        (i.e. The project ID for your project)
        token (str): The ID token used to verify the request
                     (i.e. The value found in the Authorization
                     header of an incoming request)
    Returns:
        True if the request came from Google, False otherwise.
    """
    id_info = id_token.verify_oauth2_token(token, requests.Request(), audience)
    return id_info['iss'] == 'https://accounts.google.com'
    

자바

/**
 * Verifies that an incoming request came from Google.
 * @param audience The expected audience of the request
 *                 (i.e. The project ID for your project)
 * @param token The ID token used to verify the request
 *              (i.e. The value found in the Authorization
 *              header of an incoming request)
 * @return {@code true} if request is from Google, else {@code false}
 */
public boolean isRequestFromGoogle(String audience, String token) {
  GoogleIdTokenVerifier verifier = new GoogleIdTokenVerifier
      .Builder(transport, jsonFactory)
      .setAudience(Collections.singletonList(audience))
      .build();

  GoogleIdToken idToken = verifier.verify(token);
  if (idToken == null) return false;
  Payload payload = idToken.getPayload();
  String issuer = (String) payload.get("iss");
  return issuer.equals("https://accounts.google.com");
}