Hesaplar arası koruma ile kullanıcı hesaplarını koruyun

Koleksiyonlar ile düzeninizi koruyun İçeriği tercihlerinize göre kaydedin ve kategorilere ayırın.

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

Bu bildirimler, kullanıcılarınızın Google Hesaplarında yapılan önemli değişiklikler konusunda sizi uyarır. Bu değişiklikler, çoğu zaman uygulamanızda kullandıkları hesaplar için güvenlik etkileri de oluşturabilir. Örneğin, bir kullanıcının Google Hesabı ele geçirilmişse, bu durum potansiyel olarak e-posta hesabı kurtarma veya tek oturum açma işlevlerini kullanarak kullanıcının hesabının konusunda güvenlik ihlaline neden olabilir.

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

Hesaplar Arası Koruma, OpenID Vakfı'nda geliştirilen RISC standardına dayanır.

Genel bakış

Uygulama veya hizmetinizle Hesaplar Arası Korumayı kullanmak için aşağıdaki görevleri tamamlamanız gerekir:

  1. API Consoleiçinde projenizi oluşturun.

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

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

Ön koşul

Yalnızca hizmet profillerine veya e-posta adreslerine erişmesine izin 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. Yeni Google ile Oturum Açma veya eski Google ile Oturum Açma SDK'ları varsayılan olarak bu kapsamları ister, ancak varsayılan ayarları kullanmazsanız veya Google'ın OpenID Connect uç noktasına doğrudan erişiyorsanız bu kapsamlardan en az birini istediğinizden emin olun.

API Consoleiçinde bir proje oluşturun

Güvenlik işlemi jetonlarını almaya başlamadan önce bir hizmet hesabı oluşturmanız ve RISC API'yiAPI Console projenizde 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 Consoleprojesini seçin.

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

  3. RISC Configuration Manager rolüne (roles/riscconfigs.admin) sahip olmak için bu talimatları uygulayarak yeni bir hizmet hesabı oluşturun.

  4. Yeni oluşturduğunuz hizmet hesabı 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 bir yerde saklayın, ancak etkinlik alıcı uç noktanızın erişimine de izin verin.

Projenizin Kimlik Bilgileri sayfasındayken 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 Consoleuygulaması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 gereksinimleri anladığınızdan emin olun.

    API'yi bir kuruluşa ait bir proje için etkinleştiriyorsanız kuruluşunuzu RISC Şartları'na tabi kılma yetkiniz olduğundan emin olun.

  3. Yalnızca RISC Şartları'nı kabul ederseniz 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, uç nokta için güvenlik etkinliği jetonu adlı kriptografik olarak imzalanmış dizeleri yayınlamaya başlar. Güvenlik etkinliği jetonları, güvenlikle ilgili tek bir etkinlik hakkında bilgi içeren imzalı JWT'lerdir.

Uç noktanızda aldığınız her güvenlik etkinliği jetonu için önce jetonu doğrulayıp çözün, ardından hizmetinize uygun şekilde güvenlik etkinliğini işleyin. Kötü niyetli kişilerin kötü niyetli saldırıları önlemek için, kod çözme işleminden önce etkinlik jetonunu doğrulamak zorunludur. Aşağıdaki bölümlerde şu görevler açıklanmaktadır:

1. Güvenlik etkinliği jetonunun kodunu çözme ve doğrulama

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ı korumayı sağlayan tanımlayıcıyı (issuer) ve imza anahtarı sertifika URI'sini (jwks_uri) Google'ın RISC yapılandırması dokümanından alın. Bu kılavuzu https://accounts.google.com/.well-known/risc-configuration adresinde bulabilirsiniz.
  2. Seçtiğiniz JWT kitaplığını kullanarak güvenlik etkinliği jetonunun başlığından imzalama anahtarı kimliğini alın.
  3. Google'ın imzalama anahtarı sertifika belgesinden, önceki adımda aldığınız anahtar kimliğiyle ortak anahtarı alın. Doküman, aradığınız kimliğe sahip bir anahtar içermiyorsa muhtemelen güvenlik etkinliği jetonu geçersizdir ve uç noktanızın HTTP hatası 400 döndürmesi gerekir.
  4. Seçtiğ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 hak talebi, uygulamalarınızın istemci kimliklerinden biridir.
    • Jetonun iss hak talebi, RISC keşif dokümanından aldığınız sertifikayı veren kimliğiyle eşleşir. Güvenlik etkinliği jetonları geçmiş etkinlikleri temsil ettiği ve bu nedenle de geçerliliklerin dolmadığı için jetonun geçerlilik süresini (exp) doğrulamanıza gerek yoktur.

Örneğin:

Java

java-jwt ve jwks-rsa-java kullanma:

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üldüyse HTTP durumu 202'yi döndürün. Ardından, jetonun belirttiği güvenlik etkinliğini işleyin.

2. Güvenlik işlemlerini yönetme

Kod çözme işlemi tamamlandığında bir güvenlik etkinliği jetonu aşağıdaki örnek 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 iddiaları, jetonu vereni (Google) ve jetonun hedef alıcısını (hizmetiniz) belirtir. Bu hak taleplerini önceki adımda doğruladınız.

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

events hak talebi, jetonun temsil ettiği güvenlik etkinliği hakkında bilgi içerir. Bu iddia, bir etkinlik türü tanımlayıcısından bu etkinlikle ilgili kullanıcıyı belirten bir subject hak talebine ve mümkün olduğu durumlarda etkinlikle ilgili ek ayrıntılara yapılan bir eşlemedir.

subject hak talebi, kullanıcının benzersiz Google Hesabı Kimliğine (sub) sahip belirli bir kullanıcıyı tanımlar. Bu Google Hesabı Kimliği; daha yeni Google ile Oturum Açma (Javascript, HTML) kitaplığı, eski Google ile Oturum Açma kitaplığı veya OpenID Connect tarafından sağlanan JWT kimlik jetonlarında bulunan tanımlayıcıdır. Hak talebinin subject_type kısmı id_token_claims olduğunda kullanıcının e-posta adresini içeren bir email alanı da içerebilir.

events hak talebinde yer alan bilgileri, belirtilen kullanıcının hesabındaki etkinlik türüyle ilgili uygun işlemi yapmak için 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.

jeton_tanımlayıcı_alg jeton
prefix Jetonun ilk 16 karakteri.
hash_base64_sha512_sha512 SHA-512 kullanan jetonun çift karma değeri.

Bu etkinliklerle entegre ederseniz etkinlik alındığında hızlı bir eşleşme olması 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 etkinliği türlerini destekler:

Etkinlik Türü Özellikler Yanıt Verme
https://schemas.openid.net/secevent/risc/event-type/sessions-revoked Zorunlu: Açık oturumlarını sonlandırarak kullanıcının hesabını yeniden güvenli hale getirin.
https://schemas.openid.net/secevent/oauth/event-type/tokens-revoked

Gerekli: Jeton Google ile Oturum Açma için açıksa şu anda açık olan oturumlarını sonlandırın. Ayrıca, kullanıcıya alternatif bir oturum açma yöntemi oluşturmasını önerebilirsiniz.

Önerilen: Jeton diğer Google API'lerine erişim içinse kullanıcının depoladığınız OAuth jetonlarından herhangi birini 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ünü inceleyin

Gerekli: İlgili yenileme jetonunu depolarsanız bunu 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ılmasının nedeni hijacking ise şu anda açık olan oturumlarını sonlandırarak kullanıcının hesabını yeniden güvenli hale getirin.

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

Önerilen: Herhangi bir neden belirtilmemişse kullanıcı için Google ile Oturum Açma özelliğini devre dışı bırakın ve kullanıcının Google Hesabıyla ilişkili e-posta adresini (genellikle bir Gmail hesabı olması gerekir) kullanarak hesap kurtarma işlemini 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 özelliğini ve hesap kurtarma işlemini, kullanıcının Google Hesabı e-posta adresiyle yeniden etkinleştirin.
https://schemas.openid.net/secevent/risc/event-type/account-purged Önerilen: Kullanıcının hesabını silin veya 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 etkinliklere dikkat edin ve uygun işlemi yapın.
https://schemas.openid.net/secevent/risc/event-type/verification durum=state Önerilen: Test jetonunun alındığı günlüğü.

Yinelenen ve kaçırılan etkinlikler

Hesaplar Arası Koruma, teslim edilmediğini düşündüğü etkinlikleri yeniden yayınlamaya çalışır. Bu nedenle, bazen aynı etkinliği birden çok kez alabilirsiniz. Kullanıcılarınızı rahatsız eden yinelenen işlemlere neden oluyorsa etkinlikleri tekilleştirmek için jti hak talebini (bir etkinliğin benzersiz tanımlayıcısı) kullanabilirsiniz. Tekilleştirme veri akışını yürütmenize yardımcı olabilecek Google Cloud Dataflow gibi harici araçlar vardır.

Etkinliklerin sınırlı yeniden denemelerle yapıldığını unutmayın. Alıcınız uzun bir süre kapalı kalırsa bazı etkinlikleri kalıcı olarak kaçırabilirsiniz.

Alıcınızı kaydetme

Güvenlik etkinliklerini almaya başlamak için RISC API'yi kullanarak alıcı uç noktanızı kaydedin. RISC API'sine yapılan çağrılara bir yetkilendirme jetonu eşlik etmelidir.

Yalnızca uygulamanızın kullanıcıları için güvenlik etkinlikleri alacaksınız. Bu nedenle, aşağıda açıklanan adımlarda ön koşul olarak GCP projenizde yapılandırılmış bir OAuth izin ekranının olması gerekir.

1. Yetkilendirme jetonu oluşturma

RISC API için yetkilendirme jetonu oluşturmak üzere aşağıdaki hak talepleriyle 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
}

Hizmet hesabınızın özel anahtarını kullanarak JWT'yi imzalayın. Bu anahtarı, hizmet hesabı anahtarını oluştururken indirdiğiniz JSON dosyasında bulabilirsiniz.

Ö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, RISC API çağrılarını bir saat boyunca 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ırması API'sini çağırma

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

Bunu yapmak için alıcı uç noktanızı ve ilgilendiğiniz güvenlik etkinliği 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ını almaya başlar. Bir sonraki bölümde, her şeyin düzgün şekilde ç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 akış yapılandırmanızı alma ve güncelleme

Gelecekte akış yapılandırmanızı değiştirmek isterseniz geçerli akış yapılandırmasını almak için https://risc.googleapis.com/v1beta/stream adresine 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ığı şekilde https://risc.googleapis.com/v1beta/stream:update adresinde YAYINLA açarak bunu yapabilirsiniz.

Etkinlik akışını durdur ve devam ettir

Etkinlik akışını Google'dan durdurmanız gerekirse isteğin gövde bölümünde { "status": "disabled" } için https://risc.googleapis.com/v1beta/stream/status:update adresine yetkili bir POST isteği gönderin. Akış devre dışıyken Google, etkinlikleri uç noktasına göndermez ve gerçekleştiğinde güvenlik etkinliklerini arabelleğe almaz. Etkinlik akışını yeniden etkinleştirmek için { "status": "enabled" } öğesini aynı uç noktaya gönderin.

3. İsteğe bağlı: Yayın yapılandırmanızı test edin

Etkinlik akışınız üzerinden bir doğrulama jetonu göndererek, yayın yapılandırmanızın ve alıcı uç noktanızın birlikte düzgün şekilde çalıştığını doğrulayabilirsiniz. Bu jeton, jetonun uç noktanızda alındığını doğrulamak için kullanabileceğiniz benzersiz bir dize içerebilir.

Doğrulama jetonu istemek için şu adrese yetkili bir HTTPS POST isteği gönderin: https://risc.googleapis.com/v1beta/stream:verify. İsteğin gövde bölümünde, tanımlayıcı bir dize 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 doğrulama jetonlarını basit bir şekilde günlüğe kaydederse jetonların alındığını onaylamak için günlüklerinizi inceleyebilirsiniz.

Hata kodu referansı

Aşağıdaki hatalar RISC API'sı tarafından döndürülebilir:

Hata Kodu Hata Mesajı Önerilen İşlemler
400 Akış yapılandırması $fieldname alanını içermelidir. https://risc.googleapis.com/v1beta/stream:update uç nokta isteğiniz geçersiz veya ayrıştırılamıyor. Lütfen isteğinize $fieldname ifadesini ekleyin.
401 Yetkilendirilmedi. Yetkilendirme başarısız oldu. İsteğe bir yetkilendirme jetonu eklediğinizden, jetonun geçerli olduğundan ve süresinin dolmadığından emin olun.
403 Yayınlama uç noktası bir HTTPS URL'si olmalıdır. Yayınlama uç noktanız (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ı, RISC için spesifikasyona uygun yayınlanma yöntemine sahip değil. Google Cloud projenizin zaten bir 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 hizmetini yönetir; özel bir 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ıp bir saat sonra yeniden güncellemeyi deneyin.
403 Proje bulunamadı. Doğru proje için doğru hizmet hesabını kullandığınızdan emin olun. Silinmiş bir projeyle ilişkili bir hizmet hesabı kullanıyor olabilirsiniz. Projeyle ilişkilendirilmiş tüm hizmet hesaplarını nasıl göreceğinizi öğrenin.
403 Hizmet hesabının RISC yapılandırmanıza erişmesi için izin gerekiyor Projenizin API Console sayfasına 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 Hesabı'nı hizmet hesabıyla nasıl arayacağınız hakkında daha fazla bilgi edinin.
403 Yayınlama uç noktası, projenizin hiçbir alanına ait değil. Her projede yetkili alanlar bulunur. Yayınlama uç noktanız (RISC etkinliklerinin yayınlanmasını beklediğiniz uç nokta) bunlardan birinde barındırılmıyorsa uç noktanın alanını bu gruba eklemeniz gerekir.
403 Bu API'yi kullanmak için projenizin en az bir OAuth istemcisi olması gerekir. RISC yalnızca Google ile Oturum Açma özelliğini destekleyen bir uygulama geliştirdiğinizde çalışır. Bu bağlantı bir OAuth istemcisi gerektirir. Projenizde OAuth istemcisi yoksa RISC muhtemelen sizin için faydalı olmaz. 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ını destekliyoruz.
404

Projede RISC yapılandırması yok.

Projede mevcut 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'sinin kimliğini doğrulamak için erişim jetonları kullanmaya karar verirseniz uygulamanızın isteyeceği 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ümüzü inceleyin. Hâlâ sorularınız varsa bunları #SecEvents etiketiyle Stack Overflow'da yayınlayın.