계정 간 보안으로 사용자 계정 보호하기

앱에서 사용자가 Google을 통해 계정에 로그인할 수 있는 경우 공유하는 사용자의 보안을 사용자의 요청을 듣고 응답함으로써 계정 간 보안 서비스에서 제공하는 보안 관련 활동 알림

Google 계정에 대한 주요 변경사항을 보안에 영향을 미칠 수 있습니다. 있습니다. 예를 들어 사용자의 Google 계정이 도용된 경우 이메일을 통해 사용자의 앱 계정이 도용될 수 있습니다. 계정 복구 또는 싱글 사인온(SSO) 사용

이러한 이벤트의 위험을 완화하기 위해 Google은 보안 이벤트 토큰이라는 서비스 객체를 생성합니다 이러한 토큰은 정보 - 보안 이벤트의 유형 및 발생 시점, 그리고 사용자의 식별자이지만 이 정보를 사용하여 적절한 조치를 취할 수 있습니다 예를 들어 사용자의 Google 계정이 일시적으로 해당 사용자에 대해 'Google 계정으로 로그인'을 사용 중지하고 계정 복구 이메일이 사용자의 Gmail 주소로 전송되지 않도록 차단

계정 간 보안은 다음을 기반으로 합니다. RISC 표준. OpenID Foundation

개요

앱 또는 서비스에서 계정 간 보안 기능을 사용하려면 작업을 수행할 수 있습니다

  1. API Console에서 프로젝트를 설정합니다.

  2. Google에서 보안 이벤트를 전송할 이벤트 수신자 엔드포인트 만들기 토큰입니다. 이 엔드포인트는 수신하는 토큰의 검증을 담당합니다. 그런 다음 귀사가 선택한 방법으로 보안 이벤트에 대응하는 것입니다.

  3. 보안 이벤트 토큰 수신을 시작하려면 Google에 엔드포인트를 등록하세요.

기본 요건

보안 이벤트 토큰은 사용자의 프로필 정보나 이메일 주소에 액세스할 수 있는 권한이 있는지 확인합니다. 나 profile 또는 email 범위를 요청하여 이 권한을 얻습니다. 최신 Google 계정으로 로그인 또는 레거시 Google 로그인 SDK는 기본적으로 이러한 범위를 요청하지만 기본 설정을 사용하지 않거나 Google의 OpenID에 액세스하는 경우 엔드포인트를 직접 연결하고 하나 이상의 범위를 요청해야 합니다.

API Console에서 프로젝트 설정

보안 관련 활동 토큰을 받으려면 먼저 서비스를 만들어야 합니다. 계정을 만들고, 개발자 콘솔에서 RISC API를 API Console 프로젝트가 포함됩니다. 동일한 API Console 액세스하는 데 사용하는 프로젝트 앱의 Google 서비스(예: Google 로그인)

서비스 계정을 만들려면 다음 안내를 따르세요.

  1. API Console앱을 엽니다. Credentials page 메시지가 표시되면 API Console 프로젝트에 액세스할 수 있습니다.

  2. 사용자 인증 정보 만들기 > 서비스 계정을 클릭합니다.

  3. RISC 구성 관리자 역할로 새 서비스 계정 만들기 (roles/riscconfigs.admin) 님의 소식 받기 이 안내를 참고하세요.

  4. 새로 만든 서비스 계정의 키를 만듭니다. JSON 키 선택 만들기를 클릭합니다. 키가 생성되면 서비스 계정이 포함된 JSON 파일을 다운로드합니다. 사용자 인증 정보를 제공합니다 이 파일을 안전한 곳에 보관하되 이벤트 수신자 엔드포인트입니다.

를 통해 개인정보처리방침을 정의할 수 있습니다.

프로젝트의 사용자 인증 정보 페이지에서도 클라이언트를 기록합니다. Google 계정으로 로그인 또는 Google 로그인 (기존)에 사용하는 ID 일반적으로 각 클러스터에 대해 클라이언트 ID가 있습니다. 선택할 수 있습니다 보안 관련 활동을 검증하려면 이 클라이언트 ID가 필요합니다. 다음 섹션에 설명된 대로 구성합니다.

RISC API를 사용 설정하려면 다음 안내를 따르세요.

  1. RISC API 페이지를 엽니다. API Console입니다. 사용 중인 프로젝트가 여전히 선택되어 있는지 확인합니다

  2. RISC 약관을 읽고 요구사항을 숙지합니다.

    조직이 소유한 프로젝트에 대해 API를 사용 설정하는 경우 조직에 RISC 약관을 준수하도록 구속할 권한이 있음을 확인합니다.

  3. RISC 약관에 동의하는 경우에만 사용 설정을 클릭합니다.

이벤트 수신자 엔드포인트 만들기

Google에서 보안 관련 활동 알림을 받으려면 HTTPS 엔드포인트를 만들어야 합니다. HTTP POST 요청을 처리합니다 이 엔드포인트를 등록한 후에는 (아래 참고) Google, 보안 이벤트라는 암호화 방식으로 서명된 문자열 게시 시작 엔드포인트에 배포하면 됩니다 보안 이벤트 토큰은 서명된 JWT로, 단일 보안 관련 이벤트에 대한 정보를 수집합니다.

엔드포인트에서 수신한 각 보안 이벤트 토큰에 대해 먼저 다음을 검증하고 해당 토큰을 디코딩한 다음 있습니다. 디코딩하기 전에 이벤트 토큰의 유효성을 검사하는 것이 필수입니다. 악의적인 행위자의 악의적인 공격 다음 섹션에서는 이러한 작업을 설명합니다.

1. 보안 관련 활동 토큰 디코딩 및 검증

보안 이벤트 토큰은 특정 종류의 JWT이므로 jwt.io에 나열된 것과 같은 JWT 라이브러리)를 사용하여 디코딩 및 검증할 수 있어야 합니다 어떤 라이브러리를 사용하든 토큰 검증 코드는 있습니다.

  1. 계정 간 보안 발급기관 식별자 (issuer) 및 서명 키 가져오기 인증서 URI (jwks_uri)를 가져올 수 있습니다. GNI의 웹사이트인 g.co/newsinitiative에서 https://accounts.google.com/.well-known/risc-configuration입니다.
  2. 원하는 JWT 라이브러리를 사용하여 헤더에서 서명 키 ID를 가져옵니다. 토큰입니다.
  3. Google의 서명 키 인증서 문서에서 키 ID를 가져옵니다. 문서에 키가 포함되어 있지 않은 경우 찾는 ID가 나오면 보안 이벤트 토큰이 엔드포인트가 HTTP 오류 400을 반환해야 합니다.
  4. 원하는 JWT 라이브러리를 사용하여 다음을 확인합니다. <ph type="x-smartling-placeholder">
      </ph>
    • 보안 이벤트 토큰은 이전 단계로 넘어갑니다.
    • 토큰의 aud 클레임이 앱 중 하나임 클라이언트 ID를 찾습니다.
    • 토큰의 iss 클레임이 가져온 발급기관 식별자와 일치합니다. 문서로 보냅니다. 토큰의 만료 (exp)를 확인할 필요는 없습니다. 보안 관련 활동 토큰은 이전 이벤트를 나타내므로 만료되지 않습니다.

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

자바

java-jwt 사용 및 jwks-rsa-java:

public DecodedJWT validateSecurityEventToken(String token) {
    DecodedJWT jwt = null;
    try {
        // In a real implementation, get these values from
        // https://accounts.google.com/.well-known/risc-configuration
        String issuer = "accounts.google.com";
        String jwksUri = "https://www.googleapis.com/oauth2/v3/certs";

        // Get the ID of the key used to sign the token.
        DecodedJWT unverifiedJwt = JWT.decode(token);
        String keyId = unverifiedJwt.getKeyId();

        // Get the public key from Google.
        JwkProvider googleCerts = new UrlJwkProvider(new URL(jwksUri), null, null);
        PublicKey publicKey = googleCerts.get(keyId).getPublicKey();

        // Verify and decode the token.
        Algorithm rsa = Algorithm.RSA256((RSAPublicKey) publicKey, null);
        JWTVerifier verifier = JWT.require(rsa)
                .withIssuer(issuer)
                // Get your apps' client IDs from the API console:
                // https://console.developers.google.com/apis/credentials?project=_
                .withAudience("123456789-abcedfgh.apps.googleusercontent.com",
                              "123456789-ijklmnop.apps.googleusercontent.com",
                              "123456789-qrstuvwx.apps.googleusercontent.com")
                .acceptLeeway(Long.MAX_VALUE)  // Don't check for expiration.
                .build();
        jwt = verifier.verify(token);
    } catch (JwkException e) {
        // Key not found. Return HTTP 400.
    } catch (InvalidClaimException e) {

    } catch (JWTDecodeException exception) {
        // Malformed token. Return HTTP 400.
    } catch (MalformedURLException e) {
        // Invalid JWKS URI.
    }
    return jwt;
}

Python

import json
import jwt       # pip install pyjwt
import requests  # pip install requests

def validate_security_token(token, client_ids):
    # Get Google's RISC configuration.
    risc_config_uri = 'https://accounts.google.com/.well-known/risc-configuration'
    risc_config = requests.get(risc_config_uri).json()

    # Get the public key used to sign the token.
    google_certs = requests.get(risc_config['jwks_uri']).json()
    jwt_header = jwt.get_unverified_header(token)
    key_id = jwt_header['kid']
    public_key = None
    for key in google_certs['keys']:
        if key['kid'] == key_id:
            public_key = jwt.algorithms.RSAAlgorithm.from_jwk(json.dumps(key))
    if not public_key:
        raise Exception('Public key certificate not found.')
        # In this situation, return HTTP 400

    # Decode the token, validating its signature, audience, and issuer.
    try:
        token_data = jwt.decode(token, public_key, algorithms='RS256',
                                options={'verify_exp': False},
                                audience=client_ids, issuer=risc_config['issuer'])
    except:
        raise
        # Validation failed. Return HTTP 400.
    return token_data

# Get your apps' client IDs from the API console:
# https://console.developers.google.com/apis/credentials?project=_
client_ids = ['123456789-abcedfgh.apps.googleusercontent.com',
              '123456789-ijklmnop.apps.googleusercontent.com',
              '123456789-qrstuvwx.apps.googleusercontent.com']
token_data = validate_security_token(token, client_ids)

토큰이 유효하고 성공적으로 디코딩된 경우 HTTP 상태 202를 반환합니다. 그런 다음 토큰이 나타내는 보안 이벤트를 처리합니다.

2. 보안 관련 활동 처리

디코딩될 때 보안 관련 활동 토큰은 다음 예시와 같습니다.

{
  "iss": "https://accounts.google.com/",
  "aud": "123456789-abcedfgh.apps.googleusercontent.com",
  "iat": 1508184845,
  "jti": "756E69717565206964656E746966696572",
  "events": {
    "https://schemas.openid.net/secevent/risc/event-type/account-disabled": {
      "subject": {
        "subject_type": "iss-sub",
        "iss": "https://accounts.google.com/",
        "sub": "7375626A656374"
      },
      "reason": "hijacking"
    }
  }
}

issaud 클레임은 토큰의 발급기관 (Google)과 토큰의 의도된 수신자 (개발자 서비스) 이 소유권 주장은 다음에서 확인했습니다. 이전 단계로 넘어갑니다.

jti 클레임은 단일 보안 이벤트를 식별하는 문자열이며 스트림마다 고유합니다. 이 식별자를 사용하여 어떤 보안 관련 활동을 확인할 수 있습니다.

events 클레임에는 토큰의 보안 관련 활동에 대한 정보가 포함됩니다. 나타냅니다. 이 클레임은 이벤트 유형 식별자에서 subject로 매핑된 것입니다. 이 이벤트와 관련된 사용자를 지정하는 클레임과 사용 가능한 이벤트에 대한 세부정보입니다.

subject 클레임은 사용자의 고유한 Google 계정으로 특정 사용자를 식별합니다. 계정 ID (sub) 이 Google 계정 ID는 포함된 식별자 (sub)입니다. 최신 Google 계정으로 로그인에서 발급한 JWT ID 토큰 (JavaScript , HTML) 라이브러리, 기존 Google 로그인 라이브러리 또는 OpenID Connect subject_typeid_token_claims인 경우 email 필드도 사용자의 이메일 주소입니다.

events 클레임의 정보를 사용하여 이벤트 유형

OAuth 토큰 식별자

개별 토큰에 대한 OAuth 이벤트의 경우 token subject 식별자 유형에 다음 필드가 포함됩니다.

  • token_type: refresh_token만 지원됩니다.

  • token_identifier_alg: 가능한 값은 아래 표를 참고하세요.

  • token: 아래 표를 참고하세요.

token_identifier_alg 토큰
prefix 토큰의 처음 16자입니다.
hash_base64_sha512_sha512 SHA-512를 사용하는 토큰의 이중 해시입니다.

이러한 이벤트와 통합하는 경우 이벤트를 수신할 때 빠르게 일치시킬 수 있습니다.

지원되는 이벤트 유형

계정 간 보안은 다음과 같은 유형의 보안 관련 활동을 지원합니다.

이벤트 유형 속성 대응 방법
https://schemas.openid.net/secevent/risc/event-type/sessions-revoked 필수: 현재 있습니다.
https://schemas.openid.net/secevent/oauth/event-type/tokens-revoked

필수: Google 로그인용 토큰인 경우 현재 열려 있는 세션 또한 사용자에게 제안할 수 있는 대체 로그인 방법을 설정합니다.

권장: 다른 Google API에 액세스하기 위한 토큰이라면 저장된 사용자의 OAuth 토큰이 포함될 수 있습니다

https://schemas.openid.net/secevent/oauth/event-type/token-revoked 자세한 내용은 OAuth 토큰 식별자 섹션을 참고하세요. 토큰 식별자

필수: 갱신 토큰을 저장하는 경우 삭제합니다. 다음번에 액세스 토큰이 필요할 때 사용자에게 다시 동의하도록 요청합니다.

https://schemas.openid.net/secevent/risc/event-type/account-disabled reason=hijacking,
reason=bulk-account

필수: 계정이 사용 중지된 이유가 hijacking 계정이 복구되면 사용자 인증 정보를 종료하여 현재 열려 있는 세션

추천: 계정이 사용 중지된 이유가 bulk-account: 서비스에서 사용자의 활동을 분석하고 적절한 후속 조치를 결정합니다

권장: 이유가 제시되지 않은 경우 계정에 연결된 이메일 주소를 사용하여 계정 복구를 사용자의 Google 계정 (필수는 아니지만 일반적으로 Gmail 계정) 사용자에게 대체 로그인 방법을 제공합니다.

https://schemas.openid.net/secevent/risc/event-type/account-enabled 권장: 사용자의 Google 로그인을 다시 사용 설정하고 다시 사용 설정합니다. 사용자의 Google 계정 이메일 주소로 계정 복구
https://schemas.openid.net/secevent/risc/event-type/account-credential-change-required 권장: 서비스에서 의심스러운 활동이 있는지 살펴보고 적절한 조치를 취할 수 있습니다
https://schemas.openid.net/secevent/risc/event-type/verification state=state 추천: 테스트 토큰이 수신되었음을 로깅합니다.

중복 및 누락된 일정

계정 간 보안에서는 전송됩니다. 따라서 가끔씩 동일한 이벤트를 수신하는 경우 여러 번 반복해야 할 수도 있습니다. 이로 인해 불편을 끼치는 반복 작업이 발생할 수 있다면 사이트의 고유 식별자인 jti 클레임을 이벤트)을 사용하여 이벤트의 중복을 제거합니다. Google Cloud와 같은 외부 도구 Dataflow를 사용하는 것이 좋습니다. 데이터 흐름의 중복을 제거합니다

이벤트는 제한된 재시도로 전송되므로 수신기가 다운되면 일정 기간 동안 일부 일정을 영구적으로 놓칠 수 있습니다.

수신기 등록

보안 이벤트 수신을 시작하려면 다음을 사용하여 수신자 엔드포인트를 등록하세요. RISC API를 선택합니다. RISC API 호출에는 인증 토큰이 함께 제공되어야 합니다.

앱 사용자의 보안 관련 이벤트만 수신하므로 OAuth 동의 화면을 구성해야 합니다. 이 과정을 수료해야 합니다.

1. 승인 토큰 생성

RISC API용 승인 토큰을 생성하려면 다음을 사용하여 JWT를 만듭니다. 클레임:

{
  "iss": SERVICE_ACCOUNT_EMAIL,
  "sub": SERVICE_ACCOUNT_EMAIL,
  "aud": "https://risc.googleapis.com/google.identity.risc.v1beta.RiscManagementService",
  "iat": CURRENT_TIME,
  "exp": CURRENT_TIME + 3600
}

다음 링크에서 찾을 수 있는 서비스 계정의 비공개 키를 사용하여 JWT에 서명합니다. 서비스 계정 키를 만들 때 다운로드한 JSON 파일입니다.

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

자바

java-jwt 및 사용 Google의 인증 라이브러리:

public static String makeBearerToken() {
    String token = null;
    try {
        // Get signing key and client email address.
        FileInputStream is = new FileInputStream("your-service-account-credentials.json");
        ServiceAccountCredentials credentials =
               (ServiceAccountCredentials) GoogleCredentials.fromStream(is);
        PrivateKey privateKey = credentials.getPrivateKey();
        String keyId = credentials.getPrivateKeyId();
        String clientEmail = credentials.getClientEmail();

        // Token must expire in exactly one hour.
        Date issuedAt = new Date();
        Date expiresAt = new Date(issuedAt.getTime() + 3600000);

        // Create signed token.
        Algorithm rsaKey = Algorithm.RSA256(null, (RSAPrivateKey) privateKey);
        token = JWT.create()
                .withIssuer(clientEmail)
                .withSubject(clientEmail)
                .withAudience("https://risc.googleapis.com/google.identity.risc.v1beta.RiscManagementService")
                .withIssuedAt(issuedAt)
                .withExpiresAt(expiresAt)
                .withKeyId(keyId)
                .sign(rsaKey);
    } catch (ClassCastException e) {
        // Credentials file doesn't contain a service account key.
    } catch (IOException e) {
        // Credentials file couldn't be loaded.
    }
    return token;
}

Python

import json
import time

import jwt  # pip install pyjwt

def make_bearer_token(credentials_file):
    with open(credentials_file) as service_json:
        service_account = json.load(service_json)
        issuer = service_account['client_email']
        subject = service_account['client_email']
        private_key_id = service_account['private_key_id']
        private_key = service_account['private_key']
    issued_at = int(time.time())
    expires_at = issued_at + 3600
    payload = {'iss': issuer,
               'sub': subject,
               'aud': 'https://risc.googleapis.com/google.identity.risc.v1beta.RiscManagementService',
               'iat': issued_at,
               'exp': expires_at}
    encoded = jwt.encode(payload, private_key, algorithm='RS256',
                         headers={'kid': private_key_id})
    return encoded

auth_token = make_bearer_token('your-service-account-credentials.json')

이 인증 토큰은 1시간 동안 RISC API 호출을 수행하는 데 사용할 수 있습니다. 날짜 토큰이 만료되면 새 토큰을 생성하여 RISC API 호출을 계속합니다.

2. RISC 스트림 구성 API 호출

이제 승인 토큰이 있으므로 RISC API를 사용하여 프로젝트의 보안 이벤트 스트림(수신자 등록 포함) 할 수 있습니다

이렇게 하려면 https://risc.googleapis.com/v1beta/stream:update에 HTTPS POST 요청을 실행합니다. 수신자 엔드포인트 및 보안 유형 지정 관심 있는 이벤트:

POST /v1beta/stream:update HTTP/1.1
Host: risc.googleapis.com
Authorization: Bearer AUTH_TOKEN

{
  "delivery": {
    "delivery_method":
      "https://schemas.openid.net/secevent/risc/delivery-method/push",
    "url": RECEIVER_ENDPOINT
  },
  "events_requested": [
    SECURITY_EVENT_TYPES
  ]
}

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

Java

public static void configureEventStream(final String receiverEndpoint,
                                        final List<String> eventsRequested,
                                        String authToken) throws IOException {
    ObjectMapper jsonMapper = new ObjectMapper();
    String streamConfig = jsonMapper.writeValueAsString(new Object() {
        public Object delivery = new Object() {
            public String delivery_method =
                    "https://schemas.openid.net/secevent/risc/delivery-method/push";
            public String url = receiverEndpoint;
        };
        public List<String> events_requested = eventsRequested;
    });

    HttpPost updateRequest = new HttpPost("https://risc.googleapis.com/v1beta/stream:update");
    updateRequest.addHeader("Content-Type", "application/json");
    updateRequest.addHeader("Authorization", "Bearer " + authToken);
    updateRequest.setEntity(new StringEntity(streamConfig));

    HttpResponse updateResponse = new DefaultHttpClient().execute(updateRequest);
    Header[] responseContentTypeHeaders = updateResponse.getHeaders("Content-Type");
    StatusLine responseStatus = updateResponse.getStatusLine();
    int statusCode = responseStatus.getStatusCode();
    HttpEntity entity = updateResponse.getEntity();
    // Now handle response
}

// ...

configureEventStream(
        "https://your-service.example.com/security-event-receiver",
        Arrays.asList(
                "https://schemas.openid.net/secevent/risc/event-type/account-credential-change-required",
                "https://schemas.openid.net/secevent/risc/event-type/account-disabled"),
        authToken);

Python

import requests

def configure_event_stream(auth_token, receiver_endpoint, events_requested):
    stream_update_endpoint = 'https://risc.googleapis.com/v1beta/stream:update'
    headers = {'Authorization': 'Bearer {}'.format(auth_token)}
    stream_cfg = {'delivery': {'delivery_method': 'https://schemas.openid.net/secevent/risc/delivery-method/push',
                               'url': receiver_endpoint},
                  'events_requested': events_requested}
    response = requests.post(stream_update_endpoint, json=stream_cfg, headers=headers)
    response.raise_for_status()  # Raise exception for unsuccessful requests

configure_event_stream(auth_token, 'https://your-service.example.com/security-event-receiver',
                       ['https://schemas.openid.net/secevent/risc/event-type/account-credential-change-required',
                        'https://schemas.openid.net/secevent/risc/event-type/account-disabled'])

요청이 HTTP 200을 반환하면 이벤트 스트림이 성공적으로 구성된 것입니다. 수신자 엔드포인트가 보안 이벤트 토큰 수신을 시작해야 합니다. 이 다음 섹션에서는 스트림 구성 및 엔드포인트를 테스트하는 방법을 설명합니다. 모든 것이 함께 제대로 작동하는지 확인합니다.

현재 스트림 구성 가져오기 및 업데이트

나중에 스트림 구성을 수정하고 싶은 경우 https://risc.googleapis.com/v1beta/stream에 승인된 GET 요청을 실행하여 응답 본문을 수정한 다음 POST 요청을 실행하여 위에서 설명한 대로 구성을 다시 https://risc.googleapis.com/v1beta/stream:update로 수정했습니다.

이벤트 스트림 중지 및 다시 시작

Google의 이벤트 스트림을 중지해야 하는 경우 승인된 POST를 만들어야 합니다. { "status": "disabled" }(으)로 https://risc.googleapis.com/v1beta/stream/status:update에 요청 요청 본문에 삽입하세요 스트림이 비활성화된 동안에는 Google에서 이벤트를 전송하지 않습니다. 엔드포인트로 전송되고 보안 관련 활동이 발생할 경우 버퍼링을 하지 않습니다. 받는사람 동일한 엔드포인트에 { "status": "enabled" }를 POST하는 이벤트 스트림을 다시 사용 설정합니다.

3. 선택사항: 스트림 구성 테스트

스트림 구성과 수신자 엔드포인트가 작동하는지 확인할 수 있습니다. 이벤트 스트림을 통해 인증 토큰을 전송하여 올바르게 함께 사용하세요. 이 토큰에는 토큰이 수신되었는지 확인합니다 이 흐름을 사용하려면 https://schemas.openid.net/secevent/risc/event-type/verification 구독 수신자를 등록할 때 이벤트 유형을 지정합니다.

인증 토큰을 요청하려면 승인된 HTTPS POST 요청을 전송합니다. https://risc.googleapis.com/v1beta/stream:verify 요청 본문에 식별 문자열:

{
  "state": "ANYTHING"
}

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

Java

public static void testEventStream(final String stateString,
                                   String authToken) throws IOException {
    ObjectMapper jsonMapper = new ObjectMapper();
    String json = jsonMapper.writeValueAsString(new Object() {
        public String state = stateString;
    });

    HttpPost updateRequest = new HttpPost("https://risc.googleapis.com/v1beta/stream:verify");
    updateRequest.addHeader("Content-Type", "application/json");
    updateRequest.addHeader("Authorization", "Bearer " + authToken);
    updateRequest.setEntity(new StringEntity(json));

    HttpResponse updateResponse = new DefaultHttpClient().execute(updateRequest);
    Header[] responseContentTypeHeaders = updateResponse.getHeaders("Content-Type");
    StatusLine responseStatus = updateResponse.getStatusLine();
    int statusCode = responseStatus.getStatusCode();
    HttpEntity entity = updateResponse.getEntity();
    // Now handle response
}

// ...

testEventStream("Test token requested at " + new Date().toString(), authToken);

Python

import requests
import time

def test_event_stream(auth_token, nonce):
    stream_verify_endpoint = 'https://risc.googleapis.com/v1beta/stream:verify'
    headers = {'Authorization': 'Bearer {}'.format(auth_token)}
    state = {'state': nonce}
    response = requests.post(stream_verify_endpoint, json=state, headers=headers)
    response.raise_for_status()  # Raise exception for unsuccessful requests

test_event_stream(auth_token, 'Test token requested at {}'.format(time.ctime()))

요청이 성공하면 인증 토큰이 사용자의 엔드포인트로 있습니다. 그런 다음, 예를 들어 엔드포인트가 로그를 조사하여 토큰이 유효한지 확인하기만 하면 있습니다.

오류 코드 참조

RISC API에서 다음 오류가 반환될 수 있습니다.

오류 코드 오류 메시지 권장 조치
400 스트림 구성에는 $fieldname 필드가 포함되어야 합니다. https://risc.googleapis.com/v1beta/stream:update 엔드포인트에 대한 요청이 잘못되었거나 파싱할 수 있습니다. 요청에 $fieldname을 포함하시기 바랍니다.
401 승인되지 않았습니다. 승인에 실패했습니다. 반드시 승인 토큰을 요청하고 이 토큰이 유효한지 확인합니다. 만료되지 않은 상태여야 합니다
403 전송 엔드포인트는 HTTPS URL이어야 합니다. 배포 엔드포인트 (즉, RISC 이벤트가 발생해야 하는 엔드포인트) HTTPS여야 합니다. HTTP URL에는 RISC 이벤트가 전송되지 않습니다.
403 기존 스트림 구성에 사양을 준수하는 전송이 없습니다. 사용할 수 있습니다. Google Cloud 프로젝트에 이미 RISC 구성이 있어야 합니다. 만약 Firebase를 사용하고 Google 로그인을 사용 설정하면 프로젝트에 대한 RISC 관리 맞춤 세그먼트를 만들 수는 없지만 구성할 수 있습니다 Firebase 프로젝트에서 Google 로그인을 사용하지 않는 경우 비활성화하고 한 시간 후에 다시 업데이트해 보세요.
403 프로젝트를 찾을 수 없습니다. 올바른 서비스 계정을 사용하고 있는지 살펴보겠습니다 삭제된 살펴보겠습니다 알아보기 <ph type="x-smartling-placeholder"></ph> 프로젝트와 연결된 모든 서비스 계정을 보는 방법을 참조하세요.
403 RISC에 액세스하려면 서비스 계정에 권한이 필요합니다. 구성 프로젝트의 API Console 다음으로 이동하세요. 'RISC 구성 관리자'를 역할 (roles/riscconfigs.admin) 프로젝트에 대한 호출을 수행하는 서비스 계정에 팔로잉 이 안내를 따르세요.
403 스트림 관리 API는 서비스 계정으로만 호출해야 합니다. 다음에 대한 자세한 내용은 서비스 계정으로 Google API를 호출하는 방법에 대해 자세히 알아보세요.
403 전송 엔드포인트가 프로젝트의 도메인에 속하지 않습니다. 모든 프로젝트에는 확인할 수 있습니다 전송 엔드포인트 (즉, RISC 이벤트가 발생할 것으로 예상되는 엔드포인트)가 둘 중 하나에서 호스팅되지 않는 경우 해당 세트에 엔드포인트의 도메인을 구성합니다
403 이 API를 사용하려면 프로젝트에 OAuth 클라이언트가 하나 이상 구성되어 있어야 합니다. RISC는 Google Play에서 지원하는 Google 로그인. 이 연결에는 OAuth 클라이언트가 필요합니다. 프로젝트에 OAuth가 없는 경우 클라이언트에게 RISC가 유용하지 않을 수 있습니다. 자세히 알아보기 Google의 OAuth 사용 관련 를 참조하세요.
403

지원되지 않는 상태입니다.

상태가 잘못되었습니다.

스트림 상태 'enabled' 및 현재 'disabled'.
404

프로젝트에 RISC 구성이 없습니다.

프로젝트에 기존 RISC 구성이 없으므로 상태를 업데이트할 수 없습니다.

https://risc.googleapis.com/v1beta/stream:update 엔드포인트를 호출하여 새 스트림 구성을 만듭니다.
4XX/5XX 상태를 업데이트할 수 없음 자세한 내용은 자세한 오류 메시지를 확인하세요.

액세스 토큰 범위

RISC API에 인증하기 위해 액세스 토큰을 사용하기로 결정한 경우 는 애플리케이션이 요청해야 하는 범위입니다.

엔드포인트 범위
https://risc.googleapis.com/v1beta/stream/status https://www.googleapis.com/auth/risc.status.readonly 또는 https://www.googleapis.com/auth/risc.status.readwrite
https://risc.googleapis.com/v1beta/stream/status:update https://www.googleapis.com/auth/risc.status.readwrite
https://risc.googleapis.com/v1beta/stream https://www.googleapis.com/auth/risc.configuration.readonly 또는 https://www.googleapis.com/auth/risc.configuration.readwrite
https://risc.googleapis.com/v1beta/stream:update https://www.googleapis.com/auth/risc.configuration.readwrite
https://risc.googleapis.com/v1beta/stream:verify https://www.googleapis.com/auth/risc.verify

도움이 필요하신가요?

먼저 오류 코드 참조 섹션을 확인하세요. 여전히 궁금한 점이 있으면 다음 도움말과 함께 Stack Overflow에 게시하세요. #SecEvents 태그 사이에 있어야 합니다.