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

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ı 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 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 e-posta hesabı kurtarma veya tek oturum açma özelliğinin kullanılması yoluyla kullanıcının uygulamanızdaki hesabının güvenliği ihlal edilebilir.

Google, bu tür etkinliklerin risk potansiyelini azaltmanıza yardımcı olmak için güvenlik etkinliği jetonları adlı hizmet nesnelerinizi 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ını) gösterir ancak bunlara uygun şekilde yanıt vermek için başvurabilirsiniz. Örneğin, bir kullanıcının Google Hesabı'nın güvenliği ihlal edilmişse söz konusu 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 önleyebilirsiniz.

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

Genel Bakış

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

  1. Projenizi 'te 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 etkinliklerine seçtiğiniz şekilde yanıt vermekten sorumludur.

  3. Güvenlik etkinliği 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. 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ı 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.

Güvenlik etkinliği jetonları almaya başlamadan önce bir hizmet hesabı oluşturmanız ve projenizde RISC API'yi etkinleştirmeniz gerekir. Uygulamanızda Google hizmetlerine (ör. Google ile oturum açma) erişmek için kullandığınız projeyi kullanmanız gerekir.

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

  1. simgesini açın. İstendiğinde, uygulamanızda Google hizmetlerine erişmek için kullandığınız projeyi seçin.

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

  3. Bu talimatları uygulayarak RISC Configuration Yöneticisi 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 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 tarafından erişilebilir durumda tutun.

Projenizin Kimlik Bilgileri sayfasındayken Google ile oturum aç veya Google Hesabı (eski) için kullandığınız istemci kimliklerini de not edin. Genellikle desteklediğiniz her platform için bir istemci kimliğiniz vardır. Güvenlik etkinliği jetonlarını doğrulamak için bu istemci kimliklerine ihtiyacınız vardır. Bu konu bir sonraki bölümde açıklanmıştır.

RISC API'yi etkinleştirmek için:

  1. 'de 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ğlama 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, uç noktaya güvenlik etkinliği jetonları adı verilen kriptografik olarak imzalanmış dizeler yayınlamaya başlar. Güvenlik etkinliği jetonları, güvenlikle ilgili tek bir etkinlikle ilgili bilgileri içeren imzalı JWT'lerdir.

Bitiş noktanızda aldığınız her güvenlik etkinliği jetonu için önce jetonu doğrulayın ve kodunu çözün, ardından güvenlik etkinliğini hizmetinize uygun şekilde işleyin. Kötü niyetli kişilerin kötü amaçlı saldırılarını önlemek için kod çözme işleminden ö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 çözme ve doğrulama

Güvenlik etkinliği jetonları belirli bir JWT türü olduğundan, kodlarını çö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ı tanımlayıcısı (issuer) ve imzalama anahtarı sertifika URI'sini (jwks_uri), Google'ın RISC yapılandırma belgesinden alın. Bu belgeye https://accounts.google.com/.well-known/risc-configuration adresinden ulaşabilirsiniz.
  2. Tercih ettiğ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. Belge, aradığınız kimliğe sahip bir anahtar içermiyorsa güvenlik etkinliği jetonu geçersizdir ve uç noktanız HTTP 400 hatası döndürmelidir.
  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.
    • Jetonun aud hak talebi, uygulamalarınızın istemci kimliklerinden biridir.
    • Jetonun iss iddiası, RISC keşif belgesinden aldığınız sağlayıcı tanımlayıcısıyla eşleşiyor. Güvenlik etkinliği jetonları geçmiş etkinlikleri temsil ettiğinden ve bu nedenle geçerlilik süresi sona ermediğinden jetonun geçerlilik süresinin (exp) doğrulanması gerekmez.

Örneğin:

Java

java-jwt ve jwks-rsa-java kullanılarak:

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:
                // ?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:
# ?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 202 durum kodunu döndürün. Ardından, jeton tarafından belirtilen güvenlik etkinliğini ele alın.

2. Güvenlik olaylarını işleme

Güvenlik etkinliği jetonunun kodu çözüldüğünde 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 iddiaları, jetonun sağlayıcısını (Google) ve jetonun amaçlanan alıcısını (hizmetiniz) belirtir. Bu hak taleplerini önceki adımda doğruladınız.

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

events iddiası, jetonun temsil ettiği güvenlik etkinliği hakkında bilgi içerir. Bu hak talebi, bir etkinlik türü tanımlayıcısından subjecthak talebine bir eşlemedir. Bu hak talebi, söz konusu etkinliğin ilgili olduğu kullanıcıyı ve etkinlikle ilgili mevcut olabilecek diğer ayrıntıları belirtir.

subject iddiası, belirli bir kullanıcıyı kullanıcının benzersiz Google Hesabı kimliğiyle (sub) 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 tarafından yayınlanan JWT kimlik jetonlarında bulunan aynı tanımlayıcıdır (sub). Hak talebinin subject_type değeri id_token_claims olduğunda, kullanıcının e-posta adresini içeren 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ı

Tekil jetonlarla ilgili OAuth etkinlikleri için token subject (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 token
prefix Jetonun ilk 16 karakteri.
hash_base64_sha512_sha512 SHA-512 kullanılarak jetonun çift karması.

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 etkinliği türlerini destekler:

Etkinlik Türü Özellikler Yanıt verme
https://schemas.openid.net/secevent/risc/event-type/sessions-revoked Zorunlu: Kullanıcının açık oturumlarını sonlandırarak 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 kullanıcının açık oturumlarını sonlandırın. Ayrıca, kullanıcıya alternatif bir oturum açma yöntemi oluşturmasını önerebilirsiniz.

Önerilir: Jeton diğer Google API'lerine erişim içinse kullanıcının saklamış olduğunuz 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 saklarsanız silin ve kullanıcıdan bir sonraki erişim jetonu gerektiğinde 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üvence altına alı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.

Önerilir: Herhangi bir neden belirtilmediyse 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şkili e-posta adresini (genellikle bir Gmail hesabıdır ancak her zaman Gmail hesabı olmayabilir) kullanarak hesap kurtarma özelliğini 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 Önerilir: Kullanıcı için Google ile oturum açma özelliğini ve kullanıcının Google Hesabı e-posta adresiyle hesap kurtarma özelliğini yeniden etkinleştirin.
https://schemas.openid.net/secevent/risc/event-type/account-credential-change-required Önerilen: Hizmetinizde şüpheli etkinlik olup olmadığına dikkat edin ve uygun işlemi yapın.
https://schemas.openid.net/secevent/risc/event-type/verification state=state Önerilen: Test jetonunun alındığını kaydedin.

Yinelenen ve kaçırılan etkinlikler

Hesaplar Arası Koruma, yayınlanmadığını düşündüğü etkinlikleri yeniden yayınlamaya çalışır. Bu nedenle, bazen aynı etkinliği birden fazla kez alabilirsiniz. Bu durum, kullanıcılarınızın işine yarayan tekrarlanan işlemlere neden oluyorsa etkinlikleri tekilleştirmek için jti iddiasını (bir etkinlik için benzersiz bir tanımlayıcıdır) kullanabilirsiniz. Verileri tekilleştirme akışını yürütmenize yardımcı olabilecek Google Cloud Dataflow gibi harici araçlar vardır.

Etkinliklerin sınırlı sayıda yeniden denemeyle yayınlandığını unutmayın. Bu nedenle, alıcınız uzun süre boyunca çevrimdışıysa bazı etkinlikleri kalıcı olarak kaçırabilirsiniz.

Alıcınızı kaydettirme

Güvenlik etkinlikleri 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 eklenmelidir.

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

1. Yetkilendirme jetonu oluşturma

RISC API için yetkilendirme jetonu oluşturmak üzere aşağıdaki iddiaları içeren 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ı anahtarını oluştururken indirdiğiniz JSON dosyasında bulabileceğiniz hizmet hesabınızın özel anahtarını kullanarak JWT'yi 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ırması API'sini çağırma

Yetkilendirme jetonunuz olduğu için alıcı uç noktanızı kaydettirmek de dahil olmak üzere projenizin güvenlik etkinlik akışını yapılandırmak için RISC API'yi kullanabilirsiniz.

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

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üyorsa etkinlik akışı başarıyla yapılandırılmış demektir ve alıcı uç noktanız güvenlik etkinliği jetonlarını almaya başlar. Sonraki bölümde, her şeyin birlikte düzgün şekilde çalıştığını doğrulamak için aktarma 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 yayın yapılandırmanızı değiştirmek isterseniz mevcut yayın 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ştirilmiş yapılandırmayı yukarıda açıklandığı gibi https://risc.googleapis.com/v1beta/stream:update adresine POST göndererek bunu 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 adresine yetkili bir POST isteği gönderin. Akış devre dışıyken Google, uç noktanıza etkinlik göndermez ve gerçekleşen güvenlik etkinliklerini arabelleğe almaz. Etkinlik akışını yeniden etkinleştirmek için { "status": "enabled" } öğesini aynı uç noktaya POST gönderin.

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

Akış yapılandırmanızın ve alıcı uç noktasının birlikte doğru şekilde çalıştığını doğrulamak için etkinlik akışınız üzerinden bir doğrulama jetonu gönderebilirsiniz. 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 olun.

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, 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. Örneğin, uç noktanız doğrulama jetonlarını yalnızca günlüğe kaydederek işlerse 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 gönderdiğiniz istek geçersiz veya ayrıştırılamıyor. Lütfen isteğinize $fieldname değerini ekleyin.
401 Yetkilendirilmedi. Yetkilendirme başarısız oldu. İsteğe bir yetkilendirme jetonu eklediğinizden ve 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 (yani 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 spesifikasyonlara uygun yayınlama yöntemi yok. Google Cloud projenizde 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'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üncellemeyi deneyin.
403 Proje bulunamadı. Doğru proje için doğru hizmet hesabını kullandığınızdan emin olun. Silinen bir projeyle ilişkili bir hizmet hesabı kullanıyor olabilirsiniz. Bir projeyle ilişkili 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 izne ihtiyacı var Projenizin ve "RISC Yapılandırma Yöneticisi" rolünü (roles/riscconfigs.admin) bu talimatları izleyerek projenize çağrı gönderen hizmet hesabına atayın.
403 Akış yönetimi API'leri yalnızca bir hizmet hesabı tarafından çağrılmalıdır. Hizmet hesabıyla Google API'lerini nasıl çağırabileceğiniz hakkında daha fazla bilgi edinin.
403 Yayınlama uç noktası, projenizin alan adlarından hiçbirine ait değil. Her projenin bir dizi yetkili alanı vardır. Yayınlama 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 gruba 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 özelliğini destekleyen bir uygulama geliştirirseniz çalışır. Bu bağlantı için bir OAuth istemcisi gerekir. Projenizde OAuth istemcisi yoksa RISC'nin sizin için yararlı olması muhtemel değildir. Google'ın API'lerimiz için OAuth'u kullanımı hakkında daha fazla bilgi edinin.
403

Desteklenmeyen durum.

Geçersiz durum.

Şu anda yalnızca "enabled" ve "disabled" yayın durumlarını destekliyoruz.
404

Projede RISC yapılandırması yok.

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

Yeni bir canlı yayın 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ı kontrol edin.

Erişim jetonu kapsamları

RISC API'sinde kimlik doğrulaması yapmak 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ümüze göz atın. Hâlâ sorularınız varsa bunları #SecEvents etiketiyle Stack Overflow'da yayınlayabilirsiniz.