Hesaplar Arası Koruma ile kullanıcı hesaplarını koruma

Uygulamanız, kullanıcıların Google'ı kullanarak hesaplarında oturum açmalarına izin veriyorsa Hesaplar Arası Koruma hizmeti tarafından sağlanan güvenlik etkinliği bildirimlerini dinleyip yanıtlayarak bu paylaşılan kullanıcı hesaplarının güvenliğini artırabilirsiniz.

Bu bildirimler sizi, kullanıcılarınızın Google Hesaplarında yapılan önemli değişiklikler konusunda uyarır. Bu değişiklikler genellikle uygulamanızdaki hesapları için de güvenlikle ilgili sonuçlar doğurabilir. Örneğin, bir kullanıcının Google Hesabı ele geçirilirse bu durum, e-posta hesabı kurtarma veya tek oturum açma kullanımı yoluyla kullanıcı hesabının uygulamanızdaki güvenliği ihlal edilmesine yol açabilir.

Google, bu tür olayların risk potansiyelini azaltmanıza yardımcı olmak için güvenlik etkinliği jetonları adı verilen hizmet nesnelerinizi gönderir. Bu jetonlar çok az bilgi içerir (yalnızca güvenlik etkinliğinin türü, ne zaman gerçekleştiği ve etkilenen kullanıcının tanımlayıcısı) ancak bunlara karşılık olarak uygun işlemi yapmak için bunları kullanabilirsiniz. Örneğin, bir kullanıcının Google Hesabı güvenliği ihlal edilirse bu kullanıcı için Google ile Oturum Açma özelliğini geçici olarak devre dışı bırakabilir ve hesap kurtarma e-postalarının kullanıcının Gmail adresine gönderilmesini engelleyebilirsiniz.

Hesaplar Arası Koruma, OpenID Vakfı'nda geliştirilen RISC standardını temel alır.

Genel bakış

Uygulamanız veya hizmetinizle Hesaplar Arası Koruma'yı kullanmak için aşağıdaki görevleri tamamlamanız gerekir:

  1. API Consoleuygulamasında projenizi oluşturun.

  2. Google'ın güvenlik etkinliği jetonlarını göndereceği bir etkinlik alıcısı uç noktası oluşturun. Bu uç nokta, aldığı jetonları doğrulamaktan ve ardından güvenlik etkinliklerine istediğiniz şekilde yanıt vermekten sorumludur.

  3. Güvenlik işlemi jetonları almaya başlamak için uç noktanızı Google'a kaydedin.

Ön koşul

Yalnızca hizmetinize profil bilgilerine veya e-posta adreslerine erişme izni veren Google kullanıcıları için güvenlik etkinliği jetonları alırsınız. Bu izni, profile veya email kapsamlarını isteyerek alırsınız. Daha yeni olan Google ile Oturum Açma veya eski Google ile Oturum Açma SDK'ları bu kapsamları varsayılan olarak ister. Ancak varsayılan ayarları kullanmıyorsanız veya Google'ın OpenID Connect uç noktasına doğrudan erişiyorsanız bu kapsamlardan en az birini istediğinizden emin olun.

Şurada bir proje oluşturun: API Console

Güvenlik etkinliği jetonları almaya başlayabilmeniz için önce bir hizmet hesabı oluşturmanız veAPI Console projenizde RISC API'yi etkinleştirmeniz gerekir. Uygulamanızda Google ile Oturum Açma gibi Google hizmetlerine erişmek için kullandığınızAPI Console projeyi kullanmanız gerekir.

Hizmet hesabını oluşturmak için:

  1. API Console Credentials page uygulamasını açın. İstendiğinde uygulamanızda Google hizmetlerine erişmek için kullandığınızAPI Consoleprojeyi seçin.

  2. Kimlik bilgileri oluştur > Hizmet hesabı'nı tıklayın.

  3. Bu talimatları uygulayarak RISC Yapılandırma Yöneticisi rolüne (roles/riscconfigs.admin) sahip yeni bir hizmet hesabı oluşturun.

  4. Yeni oluşturulan hizmet hesabınız için bir anahtar oluşturun. JSON anahtar türünü seçin ve ardından Oluştur'u tıklayın. Anahtar oluşturulduğunda hizmet hesabı kimlik bilgilerinizi içeren bir JSON dosyası indirirsiniz. Bu dosyayı güvenli, ancak etkinlik alıcı uç noktanız tarafından da erişilebilen bir yerde saklayın.

Projenizin Kimlik Bilgileri sayfasında, Google ile Oturum Açma veya Google ile Oturum Açma (eski) için kullandığınız istemci kimliklerini de not edin. Genellikle, desteklediğiniz her platform için bir istemci kimliğiniz vardır. Bir sonraki bölümde açıklandığı gibi, güvenlik etkinliği jetonlarını doğrulamak için bu istemci kimliklerine ihtiyacınız olacaktır.

RISC API'yi etkinleştirmek için:

  1. API Consolesayfasında RISC API sayfasını açın. Google hizmetlerine erişmek için kullandığınız projenin hâlâ seçili olduğundan emin olun.

  2. RISC Şartları'nı okuyun ve şartları anladığınızdan emin olun.

    API'yi bir kuruluşa ait bir proje için etkinleştiriyorsanız kuruluşunuzu RISC Şartları'na bağlı kılma yetkisine sahip olduğunuzdan emin olun.

  3. Yalnızca RISC Şartları'nı kabul ediyorsanız Etkinleştir'i tıklayın.

Etkinlik alıcı uç noktası oluşturma

Google'dan güvenlik etkinliği bildirimleri almak için HTTPS POST isteklerini işleyen bir HTTPS uç noktası oluşturursunuz. Bu uç noktayı kaydettikten sonra (aşağıya bakın) Google, güvenlik etkinliği jetonu adı verilen kriptografik olarak imzalanmış dizeleri uç noktaya yayınlamaya başlar. Güvenlik etkinliği jetonları, güvenlikle ilgili tek bir etkinlikle ilgili bilgi içeren imzalı JWT'lerdir.

Uç noktanızda aldığınız her güvenlik etkinliği jetonu için öncelikle jetonu doğrulayın ve kodunu çözün, ardından güvenlik etkinliğini hizmetinize uygun şekilde işleyin. Kötü niyetli kişilerden gelen kötü amaçlı saldırıları önlemek için kodu çözmeden önce etkinlik jetonunu doğrulamak zorunludur. Aşağıdaki bölümlerde bu görevler açıklanmaktadır:

1. Güvenlik etkinliği jetonunun kodunu çözün ve doğrulayın

Güvenlik etkinliği jetonları belirli bir JWT türü olduğundan bunların kodunu çözmek ve doğrulamak için jwt.io'da listelenenler gibi herhangi bir JWT kitaplığını kullanabilirsiniz. Hangi kitaplığı kullanırsanız kullanın jeton doğrulama kodunuz aşağıdakileri yapmalıdır:

  1. Hesaplar Arası Koruma'yı veren kuruluş tanımlayıcısını (issuer) ve imzalama anahtarı sertifika URI'sini (jwks_uri) Google'ın RISC yapılandırma belgesinden (https://accounts.google.com/.well-known/risc-configuration adresinde bulabilirsiniz) alın.
  2. İstediğiniz JWT kitaplığını kullanarak güvenlik etkinliği jetonunun başlığından imzalama anahtarı kimliğini alın.
  3. Google'ın imzalama anahtarı sertifikası dokümanından, önceki adımda aldığınız anahtar kimliğiyle birlikte ortak anahtarı alın. Belge, aradığınız kimliğe sahip bir anahtar içermiyorsa güvenlik etkinliği jetonunun geçersiz olması muhtemeldir ve uç noktanız, HTTP hatası 400 döndürmelidir.
  4. İstediğiniz JWT kitaplığını kullanarak aşağıdakileri doğrulayın:
    • Güvenlik etkinliği jetonu, önceki adımda aldığınız ortak anahtar kullanılarak imzalanır.
    • Jetonla ilgili aud talebi, uygulamalarınızın istemci kimliklerinden biridir.
    • Jetonun iss talebi, RISC keşif belgesinden aldığınız yayıncı tanımlayıcısıyla eşleşir. Güvenlik etkinliği jetonları geçmiş etkinlikleri temsil ettiğinden ve bu nedenle zaman aşımına uğramadığından, jetonun geçerlilik süresini (exp) doğrulamanız gerekmez.

Örneğin:

Java

java-jwt ve jwks-rsa-java kullanarak:

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)

Jeton geçerliyse ve kodu başarıyla çözülmüşse HTTP durumu 202'yi döndürün. Ardından, jetonun belirttiği güvenlik işlemini gerçekleştirin.

2. Güvenlik işlemlerini işleme

Güvenlik etkinliği jetonu, kodu çözüldüğünde aşağıdaki örnekte olduğu gibi görünür:

{
  "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"
    }
  }
}

iss ve aud talepleri, jetonu vereni (Google) ve jetonun hedeflenen alıcısını (hizmetiniz) belirtir. Bu hak taleplerini bir önceki adımda doğruladınız.

jti talebi, tek bir güvenlik etkinliğini tanımlayan ve akışa özgü olan bir dizedir. Hangi güvenlik etkinliklerini aldığınızı izlemek için bu tanımlayıcıyı kullanabilirsiniz.

events talebi, jetonun temsil ettiği güvenlik etkinliğiyle ilgili bilgileri içerir. Bu hak talebi, bir etkinlik türü tanımlayıcısından bu etkinlikle ilgili kullanıcıyı belirten subject hak talebine ve etkinlikle ilgili mevcut olabilecek tüm ek ayrıntıların eşleştirilmesidir.

subject talebi, kullanıcının benzersiz Google Hesabı Kimliği'ne (sub) sahip belirli bir kullanıcıyı tanımlar. Bu Google Hesabı Kimliği, daha yeni Google ile Oturum Açma kitaplığı (JavaScript, HTML) kitaplığı, eski Google ile Oturum Açma kitaplığı veya OpenID Connect tarafından yayınlanan JWT kimliği jetonlarında bulunanla aynıdır (sub). Hak talebinin subject_type değeri id_token_claims olduğunda bu hak, kullanıcının e-posta adresiyle birlikte bir email alanı da içerebilir.

Belirtilen kullanıcının hesabında etkinlik türüyle uygun işlemi yapmak için events talebindeki bilgileri kullanın.

OAuth jetonu tanımlayıcıları

Bağımsız jetonlarla ilgili OAuth etkinlikleri için jeton konusu tanımlayıcı türü aşağıdaki alanları içerir:

  • token_type: Yalnızca refresh_token desteklenir.

  • token_identifier_alg: Olası değerler için aşağıdaki tabloya bakın.

  • token: Aşağıdaki tabloya bakın.

token_identifier_alg jeton
prefix Jetonun ilk 16 karakteri.
hash_base64_sha512_sha512 SHA-512 kullanan jetonun çift karma değeri.

Bu etkinliklerle entegrasyon yaparsanız etkinlik alındığında hızlı bir eşleşme sağlamak için jetonlarınızı bu olası değerlere göre dizine eklemeniz önerilir.

Desteklenen etkinlik türleri

Hesaplar Arası Koruma, aşağıdaki güvenlik işlemi türlerini destekler:

Etkinlik Türü Özellikler Nasıl yanıt verilir?
https://schemas.openid.net/secevent/risc/event-type/sessions-revoked Zorunlu: Açık olan oturumlarını sonlandırarak kullanıcının hesabının güvenliğini yeniden sağlayın.
https://schemas.openid.net/secevent/oauth/event-type/tokens-revoked

Zorunlu: Jeton Google ile Oturum Açma içinse açık durumda olan oturumlarını sonlandırın. Ayrıca, kullanıcıya alternatif bir oturum açma yöntemi ayarlamasını da önerebilirsiniz.

Önerilen: Jeton diğer Google API'lerine erişim amaçlıysa kullanıcının depoladığınız tüm OAuth jetonlarını silin.

https://schemas.openid.net/secevent/oauth/event-type/token-revoked Jeton tanımlayıcıları için OAuth jetonu tanımlayıcıları bölümüne bakın

Zorunlu: İlgili yenileme jetonunu saklıyorsanız jetonu silin ve bir sonraki erişim jetonu gerektiğinde kullanıcıdan yeniden izin vermesini isteyin.

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

Zorunlu: Hesabın devre dışı bırakılma nedeni hijacking ise şu anda açık olan oturumlarını sonlandırarak kullanıcının hesabının güvenliğini yeniden sağlayın.

Önerilen: Hesabın devre dışı bırakılma nedeni bulk-account ise kullanıcının hizmetinizdeki etkinliğini analiz edin ve uygun takip işlemlerini belirleyin.

Önerilen: Herhangi bir neden sağlanmamışsa kullanıcı için Google ile Oturum Açma özelliğini devre dışı bırakın ve kullanıcının Google Hesabı ile ilişkilendirilen e-posta adresini (genellikle ama bir Gmail hesabı) kullanarak hesap kurtarmayı devre dışı bırakın. Kullanıcıya alternatif bir oturum açma yöntemi sunun.

https://schemas.openid.net/secevent/risc/event-type/account-enabled Önerilen: Kullanıcı için Google ile Oturum Açma'yı yeniden etkinleştirin ve kullanıcının Google Hesabı e-posta adresiyle hesap kurtarmayı yeniden etkinleştirin.
https://schemas.openid.net/secevent/risc/event-type/account-purged Önerilen: Kullanıcının hesabını silin veya kullanıcıya alternatif bir oturum açma yöntemi sağlayın.
https://schemas.openid.net/secevent/risc/event-type/account-credential-change-required Önerilen: Hizmetinizdeki şüpheli etkinlikleri arayın ve gerekli işlemi yapın.
https://schemas.openid.net/secevent/risc/event-type/verification state=state Önerilen: Bir test jetonunun alındığını günlüğe kaydedin.

Yinelenen ve kaçırılan etkinlikler

Hesaplar Arası Koruma, teslim edilmediğini düşündüğü etkinlikleri yeniden iletmeye çalışır. Bu nedenle, bazen aynı etkinliği bir defadan fazla alabilirsiniz. Bu durum, kullanıcılarınızı rahatsız eden tekrarlanan işlemlere neden oluyorsa etkinlikleri tekilleştirmek için jti talebini (bir etkinliğin benzersiz tanımlayıcısıdır) kullanmayı düşünün. Google Cloud Dataflow gibi harici araçlar, tekilleştirilmiş veri akışını yürütmenize yardımcı olabilir.

Etkinliklerin sınırlı yeniden denemeyle gerçekleştiğini unutmayın. Bu nedenle, alıcınız uzun bir süre kapalı kalırsa bazı etkinlikleri kalıcı olarak kaçırabilirsiniz.

Alıcınızı kaydedin

Güvenlik etkinliklerini almaya başlamak için alıcı uç noktanızı RISC API'yi kullanarak kaydedin. RISC API'ye yapılan çağrıların bir yetkilendirme jetonuyla birlikte yapılması gerekir.

Yalnızca uygulamanızın kullanıcıları için güvenlik etkinlikleri alırsınız. Bu nedenle, aşağıda açıklanan adımlar için ön koşul olarak GCP projenizde bir OAuth izin ekranını yapılandırmış olmanız gerekir.

1. Yetkilendirme jetonu oluşturma

RISC API için yetkilendirme jetonu oluşturmak için aşağıdaki iddialarla bir JWT oluşturun:

{
  "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'yi, hizmet hesabı anahtarını oluştururken indirdiğiniz JSON dosyasında bulabileceğiniz hizmet hesabınızın özel anahtarını kullanarak imzalayın.

Örneğin:

Java

java-jwt ve Google'ın kimlik doğrulama kitaplığını kullanarak:

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')

Bu yetkilendirme jetonu, bir saat boyunca RISC API çağrıları yapmak için kullanılabilir. Jetonun süresi dolduğunda RISC API çağrıları yapmaya devam etmek için yeni bir jeton oluşturun.

2. RISC akış yapılandırma API'sini çağırma

Artık bir yetkilendirme jetonunuz olduğuna göre, RISC API'yi kullanarak alıcı uç noktanızı kaydettirmek de dahil olmak üzere projenizin güvenlik etkinliği akışını yapılandırabilirsiniz.

Bunu yapmak için alıcı uç noktanızı ve ilgilendiğiniz güvenlik etkinliğinin türlerini belirterek https://risc.googleapis.com/v1beta/stream:update hizmetine HTTPS POST isteği gönderin:

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
  ]
}

Örneğin:

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'])

İstek HTTP 200 döndürürse etkinlik akışı başarıyla yapılandırılmıştır ve alıcı uç noktanız, güvenlik etkinliği jetonları almaya başlayacaktır. Sonraki bölümde, her şeyin birlikte düzgün çalıştığını doğrulamak için akış yapılandırmanızı ve uç noktanızı nasıl test edebileceğiniz açıklanmaktadır.

Mevcut yayın yapılandırmanızı alma ve güncelleme

Gelecekte akış yapılandırmanızı değiştirmek isterseniz bunu, geçerli akış yapılandırmasını almak için https://risc.googleapis.com/v1beta/stream öğesine yetkili bir GET isteği göndererek, yanıt gövdesini değiştirerek ve ardından, değiştirilen yapılandırmayı yukarıda açıklandığı gibi tekrar https://risc.googleapis.com/v1beta/stream:update öğesine YAYINlayarak yapabilirsiniz.

Etkinlik akışını durdurma ve devam ettirme

Google'dan gelen etkinlik akışını durdurmanız gerekirse istek gövdesinde { "status": "disabled" } ile https://risc.googleapis.com/v1beta/stream/status:update için yetkili bir POST isteği gönderin. Akış devre dışıyken Google, etkinlikleri uç noktanıza göndermez ve güvenlik etkinlikleri meydana geldiğinde arabelleğe almaz. Etkinlik akışını yeniden etkinleştirmek için { "status": "enabled" } aynı uç noktaya POST gönderin.

3. İsteğe bağlı: Akış yapılandırmanızı test etme

Etkinlik akışınız üzerinden bir doğrulama jetonu göndererek akış yapılandırmanızın ve alıcı uç noktanızın birlikte düzgün çalıştığını doğrulayabilirsiniz. Bu jeton, uç noktanızda jetonun alındığını doğrulamak için kullanabileceğiniz benzersiz bir dize içerebilir. Bu akışı kullanmak için alıcınızı kaydederken https://schemas.openid.net/secevent/risc/event-type/verification etkinlik türüne abone olun.

Doğrulama jetonu istemek için https://risc.googleapis.com/v1beta/stream:verify sitesine yetkili bir HTTPS POST isteği gönderin. İsteğin gövde bölümünde, bazı tanımlayıcı dizeler belirtin:

{
  "state": "ANYTHING"
}

Örneğin:

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()))

İstek başarılı olursa doğrulama jetonu, kaydettiğiniz uç noktaya gönderilir. Ardından, örneğin uç noktanız, yalnızca günlük kaydı oluşturarak doğrulama jetonlarını işliyorsa jetonun alındığını onaylamak için günlüklerinizi inceleyebilirsiniz.

Hata kodu referansı

RISC API aşağıdaki hataları döndürebilir:

Hata Kodu Hata Mesajı Önerilen İşlemler
400 Akış yapılandırması $fieldname alanını içermelidir. https://risc.googleapis.com/v1beta/stream:update uç noktasına yaptığınız istek geçersiz veya ayrıştırılamıyor. Lütfen isteğinize $fieldname ifadesini ekleyin.
401 Yetkilendirilmedi. Yetkilendirme başarısız oldu. İstekle birlikte bir yetkilendirme jetonu eklediğinizden, jetonun geçerli olduğundan ve süresinin dolmadığından emin olun.
403 Teslim uç noktası HTTPS URL'si olmalıdır. Teslim uç noktanız (ör. RISC etkinliklerinin yayınlanmasını beklediğiniz uç nokta) HTTPS olmalıdır. RISC etkinlikleri, HTTP URL'lerine gönderilmez.
403 Mevcut akış yapılandırmasının RISC için spesifikasyonla uyumlu yayınlama yöntemi yok. Google Cloud projenizde RISC yapılandırması olmalıdır. Firebase kullanıyorsanız ve Google ile Oturum Açma özelliğini etkinleştirdiyseniz Firebase, projeniz için RISC'yi yönetir. Özel yapılandırma oluşturamazsınız. Firebase projeniz için Google ile Oturum Açma özelliğini kullanmıyorsanız lütfen devre dışı bırakın ve bir saat sonra tekrar güncelleme yapmayı deneyin.
403 Proje bulunamadı. Doğru proje için doğru hizmet hesabını kullandığınızdan emin olun. Silinmiş bir projeyle ilişkilendirilmiş bir hizmet hesabı kullanıyor olabilirsiniz. Bir projeyle ilişkilendirilmiş tüm hizmet hesaplarını nasıl göreceğinizi öğrenin.
403 RISC yapılandırmanıza erişmek için hizmet hesabının izne ihtiyacı var Projenize API Console gidin ve bu talimatları uygulayarak projenize çağrı yapan hizmet hesabına "RISC Yapılandırma Yöneticisi" rolünü (roles/riscconfigs.admin) atayın.
403 Akış yönetimi API'leri yalnızca bir hizmet hesabı tarafından çağrılmalıdır. Google API'lerini bir hizmet hesabıyla nasıl çağırabileceğiniz hakkında daha fazla bilgiyi burada bulabilirsiniz.
403 Teslim uç noktası, projenizin hiçbir alanına ait değil. Her projenin bir yetkili alanı vardır. Teslim uç noktanız (ör. RISC etkinliklerinin yayınlanmasını beklediğiniz uç nokta) bunlardan birinde barındırılmıyorsa uç noktanın alanını bu kümeye eklemeniz gerekir.
403 Bu API'yi kullanmak için projenizde en az bir OAuth istemcisi yapılandırılmış olmalıdır. RISC yalnızca Google ile Oturum Açma'yı destekleyen bir uygulama derlerseniz çalışır. Bu bağlantı için OAuth istemcisi gerekiyor. Projenizde OAuth istemcisi yoksa RISC büyük olasılıkla sizin için kullanışlı olmayacaktır. Google'ın API'lerimiz için OAuth kullanımı hakkında daha fazla bilgi edinin.
403

Desteklenmeyen durum.

Geçersiz durum.

Şu anda yalnızca "enabled" ve "disabled" akış durumları desteklenmektedir.
404

Projede RISC yapılandırması yok.

Projede mevcut bir RISC yapılandırması yok, durum güncellenemiyor.

Yeni bir akış yapılandırması oluşturmak için https://risc.googleapis.com/v1beta/stream:update uç noktasını çağırın.
4XX/5XX Durum güncellenemedi. Daha fazla bilgi için ayrıntılı hata mesajını inceleyin.

Erişim jetonu kapsamları

RISC API'de kimlik doğrulaması için erişim jetonları kullanmaya karar verirseniz uygulamanızın istemesi gereken kapsamlar şunlardır:

Uç nokta Kapsam
https://risc.googleapis.com/v1beta/stream/status https://www.googleapis.com/auth/risc.status.readonly VEYA 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 VEYA 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

Yardım mı Gerekiyor?

Öncelikle hata kodu referansı bölümüne göz atın. Hâlâ sorularınız varsa bunları #SecEvents etiketiyle Stack Overflow'da yayınlayın.