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

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 artırabilirsiniz.

Bu bildirimler kullanıcılarınızın Google Hesaplarında yapılan önemli değişiklikler konusunda sizi uyarır. Bu da genellikle kullanıcılarınızın uygulamanız için kullandığı güvenlik önlemlerini etkileyebilir. Örneğin, bir kullanıcının Google Hesabının ele geçirilmesi, muhtemelen e-posta hesabı kurtarma veya tek oturum açma özelliklerini kullanarak kullanıcının hesabının uygulamasında güvenlik ihlaline yol açabilir.

Google, bu tür olayların risk potansiyelini azaltmanıza yardımcı olmak için hizmet nesnelerinize güvenlik etkinliği jetonları gönderir. Bu jetonlar, çok az bilgi (yalnızca güvenlik etkinliğinin türü ve ne zaman gerçekleştiği ve etkilenen kullanıcının tanımlayıcısı) gösterir, ancak yanıt olarak uygun işlemleri yapmak için bu jetonları kullanabilirsiniz. Örneğin, bir kullanıcının Google Hesabı güvenliğinin ihlal edilmesi durumunda, söz konusu 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 hizmetinizde Hesaplar Arası Koruma'yı 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ı göndereceği bir etkinlik alıcı uç noktası oluşturun. Bu uç nokta, aldığı jetonları doğrulamaktan ve ardından güvenlik olaylarına istediğiniz şekilde yanıt vermekten sorumludur.

  3. Güvenlik etkinliği jetonlarını 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. Yeni Google ile Oturum Açma veya eski Google ile Oturum Açma SDK'ları varsayılan olarak bu kapsamları ister. 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.

API Consoleiçinde bir proje oluşturun

Güvenlik etkinliği jetonlarını almaya başlayabilmeniz için hizmet projesi 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 bilgisi oluştur > Hizmet hesabı'nı tıklayın.

  3. Bu talimatları uygulayarak RISC Configuration Manager rolüne (roles/riscconfigs.admin) sahip 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 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ç noktasına da erişin.

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 olur. 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 Consoleiçindeki 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 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 noktası jetonu adı verilen kriptografik olarak imzalanmış dizeleri uç noktaya 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 kodunu çözün, ardından hizmetinize uygun şekilde güvenlik etkinliğini işleyin. Kötü niyetli kişilerin kötü amaçlı saldırıları önlemek için kod çözme işleminden önce etkinlik jetonunu doğrulamak gereklidir. Aşağıdaki bölümlerde bu 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ı Koruma sağlayıcısı tanımlayıcısını (issuer) ve Google'ın RISC yapılandırma belgesinden imzalama anahtarı URI'sini (jwks_uri) edinin. Belgeyi https://accounts.google.com/.well-known/risc-configuration adresinde bulabilirsiniz.
  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ı sertifika dokümanından, ö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 güvenlik etkinliği jetonu büyük olasılıkla geçersizdir ve uç noktanızdan HTTP hatası 400 döndürülür.
  4. Tercih ettiğ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 tanımlayıcı tanımlayıcısıyla eşleşir. Güvenlik etkinliği jetonları geçmiş etkinlikleri temsil ettiğinden ve bu nedenle de süresi dolmaz. Bu nedenle, jetonun son kullanma tarihini (exp) doğrulamanıza gerek yoktur.

Ö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 kodun kodu başarıyla çözüldüyse HTTP durumu 202'yi döndürün. Ardından, jeton tarafından gösterilen güvenlik etkinliğini işleyin.

2. Güvenlik etkinliklerini işleme

Kodu çözüldüğünde, güvenlik etkinliği jetonu aşağıdaki örneğe benzer:

{
  "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 hak talepleri, jetonu veren (Google) ve jetonun hedeflenen alıcısı (hizmetiniz) bilgilerini gösterir. Bu hak taleplerini önceki adımda doğruladınız.

jti hak 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 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 bir subject hak talebine eşlemedir. Bu hak talebi, bu etkinliğin ilgili olduğu kullanıcıyı ve etkinlikle ilgili olarak kullanılabilecek diğer ayrıntıları belirtir.

subject hak talebi, kullanıcının benzersiz Google Hesap Kimliğine (sub) sahip belirli bir kullanıcıyı tanımlar. Bu Google Hesabı kimliği, yeni Google ile Oturum Açma (JavaScript, HTML) kitaplığı, eski Google ile Oturum Açma kitaplığı veya OpenID Connect'in verdiği JWT kimliği jetonlarında bulunan tanımlayıcıdır.sub Hak talebinin subject_type değeri id_token_claims olduğunda kullanıcının e-posta adresinin bulunduğu bir email alanı da içerebilir.

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

OAuth jetonu tanımlayıcıları

Tek tek 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 kullanılarak jetonun çift karma değeri.

Bu etkinliklerle entegre ederseniz 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 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 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

Gerekli: Jeton Google ile Oturum Açma içinse mevcut açık oturumlarını sonlandırın. Ayrıca, kullanıcıya alternatif bir oturum açma yöntemi oluşturması için öneride bulunabilirsiniz.

Ö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üne bakın

Gerekli: İlgili yenileme jetonunu depoluyorsanız bu jetonu silin ve erişim jetonu gerektiğinde tekrar kullanıcıdan izin isteyin.

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

Gerekli: 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 takip işlemlerini belirleyin.

Önerilen: Herhangi bir neden belirtilmediği takdirde, kullanıcı için Google ile Oturum Açma özelliğini devre dışı bırakır ve kullanıcının Google Hesabı ile ilişkilendirilmiş e-posta adresini kullanarak hesap kurtarmayı devre dışı bırakır. 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 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: Hizmetinizde şüpheli etkinlik olup olmadığına bakın ve gerekli işlemi yapın.
https://schemas.openid.net/secevent/risc/event-type/verification eyalet=state Önerilen: 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 yayınlamaya çalışır. Bu nedenle, bazen aynı etkinliği birden çok kez alabilirsiniz. Bu durum, kullanıcılarınızın sorun yaşamasına neden olan yinelenen işlemlere neden oluyorsa etkinlikleri tekilleştirmek için jti hak talebini (bir etkinliğin benzersiz tanımlayıcısı) kullanabilirsiniz. Dupup veri akışını yürütmenize yardımcı olabilecek Google Cloud Dataflow gibi harici araçlar vardır.

Etkinliklerin sınırlı yeniden deneme sayısıyla iletildiğini unutmayın. Bu nedenle, alıcınız uzun 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'si çağrılarına bir yetkilendirme jetonu eşlik etmelidir.

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

1. Yetkilendirme jetonu oluşturma

RISC API için bir 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ı için bir saat süreyle kullanılabilir. Jetonun süresi dolduğunda RISC API çağrıları yapmaya devam etmek için yeni bir jeton oluşturun.

2. RISC Stream Configuration API'yi çağırma

Artık bir yetkilendirme jetonunuz olduğuna göre, alıcı uç noktanızı 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 için bir 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 hatası 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şlamalıdır. Bir sonraki bölümde, her şeyin düzgün bir şekilde çalıştığını doğrulamak için akış yapılandırmanızı ve uç noktanızı nasıl test edebileceğinizi açıklar.

Geçerli yayın yapılandırmanızı alma ve güncelleme

Gelecekte akış yapılandırmanızı değiştirmek isterseniz bunu yapmak için geçerli akış yapılandırmasını almak üzere https://risc.googleapis.com/v1beta/stream öğesine yetkilendirilmiş bir GET isteği göndererek yanıt gövdesini değiştirebilir, ardından değiştirilen yapılandırmayı yukarıda açıklandığı şekilde https://risc.googleapis.com/v1beta/stream:update üzerinde YAYINLAYIN.

Etkinlik akışını durdur ve devam ettir

Etkinlik akışını Google'dan 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 meydana geldiklerinde güvenlik etkinliklerini arabelleğe almaz. Etkinlik akışını yeniden etkinleştirmek için { "status": "enabled" } özelliğini aynı uç noktaya gönderin.

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

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 ş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. Bu akışı kullanmak için alıcınızı kaydederken https://schemas.openid.net/secevent/risc/event-type/verification etkinlik türüne abone olmayı unutmayın.

Doğrulama jetonu istemek için https://risc.googleapis.com/v1beta/stream:verify adresine 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. Örneğin, uç noktanız doğrulama jetonlarını günlüğe kaydederek çalışıyorsa 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ı içermelidir. https://risc.googleapis.com/v1beta/stream:update uç noktası 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 Teslim uç noktası bir 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ında RISC için spesifikasyona uygun yayınlanma yöntemi yok. 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'i 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 bunu devre dışı bırakın ve bir saat sonra güncellemeyi tekrar 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 Hizmet hesabının RISC yapılandırmanıza erişmesi için izin gerekiyor Projenizin API Console adresine 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 adına ait değil. Her projenin bir yetkili alan grubu vardır. Teslim uç noktanız (RISC etkinliklerinin yayınlanmasını beklediğiniz uç nokta) bunlardan birinde barındırılmıyorsa uç noktanın alan adı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 derlediğinizde çalışır. Bu bağlantı için bir OAuth istemcisi gerekiyor. Projenizde OAuth istemcisi yoksa RISC büyük olasılıkla sizin için yararlı olmayacaktır. Google'ın API'lerimizde 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 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'sinde kimlik doğrulaması için erişim jetonları kullanmaya karar verirseniz uygulamanız için aşağıdaki kapsamlar gereklidir:

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.