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 dinleyip yanıtlayarak bu ortak 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 değişiklikler genellikle uygulamanızdaki hesaplarının güvenliğini de etkileyebilir. Örneğin, bir kullanıcının Google Hesabı ele geçirilirse e-posta hesabı kurtarma veya tek oturum açma özelliği kullanılarak 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ı adı verilen 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ı) gösterir ancak bunlardan yararlanarak uygun önlemler alabilirsiniz. Ö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 Foundation'da geliştirilen RISC standardına dayanır.
Genel Bakış
Uygulamanızda veya hizmetinizde Hesaplar Arası Koruma'yı kullanmak için aşağıdaki görevleri tamamlamanız gerekir:
Projenizi API Consoleiçinde oluşturun.
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 etkinliklerine istediğiniz şekilde yanıt vermekten sorumludur.
Güvenlik durumu jetonları almaya başlamak için uç noktanızı Google'a kaydedin.
Ön koşul
Yalnızca hizmetinizin profil bilgilerine 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. 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 ya da Google'ın OpenID Connect uç noktasına doğrudan erişiyorsanız bu kapsamların en az birini istediğinizden emin olun.
API Consoleiçinde proje oluşturma
Güvenlik etkinliği jetonları almaya başlamadan önce bir hizmet hesabı oluşturmanız veAPI Console projenizde RISC API'yi etkinleştirmeniz gerekir. Uygulamanızda Google hizmetlerine (ör. Google ile Giriş) erişmek için kullandığınızAPI Console projenin aynısını kullanmanız gerekir.
Hizmet hesabını oluşturmak için:
API Console Credentials page uygulamasını açın. İstendiğinde uygulamanızda Google hizmetlerine erişmek için kullandığınızAPI Console projesini seçin.
Kimlik bilgisi oluştur > Hizmet hesabı'nı tıklayın.
roles/riscconfigs.admin
RISC Yapılandırma Yöneticisi rolüne sahip yeni bir hizmet hesabı oluşturmak için bu talimatları uygulayın. (roles/riscconfigs.admin
) bu talimatları uygulayarak.Yeni oluşturduğunuz hizmet hesabınız 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 ancak etkinlik alıcısı uç noktanızın erişebileceği bir yerde saklayın.
Projenizin Kimlik Bilgileri sayfasındayken Google ile oturum açma veya Google 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:
API Console'da RISC API sayfasını açın. Google hizmetlerine erişmek için kullandığınız projenin seçili olduğundan emin olun.
RISC Şartları'nı okuyun ve şartları anladığınızdan emin olun.
API'yi bir kuruluşa ait proje için etkinleştiriyorsanız kuruluşunuzu RISC Şartları'na bağlama yetkinizin olduğundan emin olun.
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 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 güvenlik olayını 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ğrulamanız gerekir. Aşağıdaki bölümlerde bu görevler açıklanmaktadır:
1. Güvenlik etkinliği jetonunun kodunu çözme ve jetonu doğrulama
Güvenlik etkinliği jetonları belirli bir JWT türü olduğundan bunları kod çö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:
- Google'ın RISC yapılandırma belgesinden hesaplar arası koruma veren kuruluş tanımlayıcısını (
issuer
) ve imzalama anahtarı sertifikası URI'sini (jwks_uri
) alın. Bu belgeyihttps://accounts.google.com/.well-known/risc-configuration
adresinde bulabilirsiniz. - Seçtiğiniz JWT kitaplığını kullanarak güvenlik etkinliği jetonunun başlığından imzalama anahtarı kimliğini alın.
- Google'ın imzalama anahtarı sertifikası dokümanından, önceki adımda aldığınız anahtar kimliğine sahip ortak anahtarı alın. Belgede, aradığınız kimliğe sahip bir anahtar yoksa güvenlik etkinliği jetonu muhtemelen geçersizdir ve uç noktanız HTTP hata 400'ü döndürmelidir.
- 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
talebi, uygulamalarınızın istemci kimliklerinden biridir. - Jetonun
iss
talebi, RISC keşif belgesinden aldığınız veren tanımlayıcısıyla eşleşiyor. Güvenlik etkinliği jetonları geçmiş etkinlikleri temsil ettiğinden ve bu nedenle geçerlilikleri sona ermediğinden jetonun geçerlilik bitiş tarihini (exp
) doğrulamanız gerekmediğini unutmayın.
Örneğin:
Java
java-jwt ve jwks-rsa-java'yı 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 başarıyla kod çözme işlemi yapıldıysa HTTP durumu 202'yi döndürün. Ardından, jetonun belirttiği güvenlik olayını ele alın.
2. Güvenlik olaylarını işleme
Güvenlik etkinliği jetonu çö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
talepleri, jetonu veren tarafı (Google) ve jetonun amaçlanan alıcısını (hizmetiniz) gösterir. Bu hak taleplerini önceki adımda doğruladınız.
jti
talebi, tek bir güvenlik olayını tanımlayan ve akışa özgü olan bir dizedir. Bu tanımlayıcıyı, hangi güvenlik etkinliklerini aldığınızı izlemek için kullanabilirsiniz.
events
talebi, jetonun temsil ettiği güvenlik etkinliği hakkında bilgi içerir. Bu talep, bir etkinlik türü tanımlayıcısından, bu etkinliğin hangi kullanıcıyla ilgili olduğunu belirten bir subject
talebe ve etkinlikle ilgili olabilecek ek ayrıntılara yönelik bir eşlemedir.
subject
talebi, kullanıcıyı benzersiz Google Hesabı kimliğiyle (sub
) 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 verilen JWT kimlik jetonlarında bulunan tanımlayıcıyla (sub
) aynıdır. Hak talebinin subject_type
bölümü 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üyle ilgili uygun işlemi yapmak için events
talebindeki bilgileri kullanın.
OAuth jetonu tanımlayıcıları
Tek tek jetonlarla ilgili OAuth etkinliklerinde token subject tanımlayıcı türü aşağıdaki alanları içerir:
token_type
: Yalnızcarefresh_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 kullanılarak oluşturulan jetonun çift karması. |
Bu etkinliklerle entegrasyon yapıyorsanı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 etkinliklerini destekler:
Etkinlik Türü | Özellikler | Yanıt verme |
---|---|---|
https://schemas.openid.net/secevent/risc/event-type/sessions-revoked |
Zorunlu: Kullanıcının şu anda açık olan oturumlarını sonlandırarak hesabını yeniden güvenli hâle getirin. | |
https://schemas.openid.net/secevent/oauth/event-type/tokens-revoked |
Zorunlu: Jeton, Google ile oturum açma içinse kullanıcının şu anda açık olan oturumlarını sonlandırın. Ayrıca, kullanıcıya alternatif bir oturum açma yöntemi ayarlamasını önerebilirsiniz. Önerilen: Jeton, diğer Google API'lerine erişim içinse kullanıcının depoladığınız 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 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 Önerilen: Hesap devre dışı bırakılma nedeni Önerilen: Herhangi bir neden belirtilmediyse kullanıcı için Google ile oturum açma özelliğini ve kullanıcının Google Hesabı ile ilişkili e-posta adresini (genellikle Gmail hesabı) 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 |
Önerilen: 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: Hizmetinizdeki şüpheli etkinliklere karşı dikkatli olun ve uygun önlemleri alı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, teslim edilmediğini düşündüğü etkinlikleri yeniden teslim etmeye çalışır. Bu nedenle, aynı etkinliği bazen birden fazla kez alabilirsiniz. Bu durum, kullanıcılarınızın rahatsız olmasına neden olacak tekrarlanan işlemlere yol açabilir. Bu nedenle, etkinliklerin tekilleştirilmesi için jti
talebini (bir etkinlik için benzersiz tanımlayıcı) kullanmayı düşünebilirsiniz. Google Cloud Dataflow gibi, yinelenen verileri kaldırma veri akışını yürütmenize yardımcı olabilecek harici araçlar vardır.
Etkinliklerin sınırlı sayıda yeniden denemeyle teslim edildiğini unutmayın. Bu nedenle, alıcınız uzun bir süre boyunca kapalıysa bazı etkinlikleri kalıcı olarak kaçırabilirsiniz.
Alıcınızı kaydettirme
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ılara bir yetkilendirme jetonu eşlik etmelidir.
Yalnızca uygulamanızın kullanıcılarıyla ilgili güvenlik etkinliklerini alırsınız. Bu nedenle, aşağıda açıklanan adımların ön koşulu olarak GCP projenizde bir OAuth izin ekranı yapılandırmanız gerekir.
1. Yetkilendirme jetonu oluşturma
RISC API için yetkilendirme jetonu oluşturmak üzere aşağıdaki talepleri 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ı kullanma:
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
Yetkilendirme jetonunuz olduğuna göre, alıcı uç noktanızı kaydetme de dahil olmak üzere projenizin güvenlik etkinliği 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. Alıcı uç noktanızı ve ilgilendiğiniz güvenlik olayı 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ü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şlamalıdır. Sonraki bölümde, her şeyin birlikte doğru ş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 yayın yapılandırmanızı değiştirmek isterseniz https://risc.googleapis.com/v1beta/stream
adresine yetkili bir GET isteği göndererek mevcut yayın yapılandırmasını alabilir, yanıt gövdesini değiştirebilir ve ardından yukarıda açıklandığı gibi değiştirilen yapılandırmayı https://risc.googleapis.com/v1beta/stream:update
adresine geri POST edebilirsiniz.
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, uç noktanıza etkinlik göndermez ve güvenlik etkinlikleri gerçekleştiğinde bunları arabelleğe almaz. Etkinlik akışını yeniden etkinleştirmek için aynı uç noktaya { "status": "enabled" }
POST isteği 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 akış yapılandırmanızın ve alıcı uç noktanızın birlikte doğru şekilde çalıştığını doğrulayabilirsiniz. Bu jeton, jetonun uç noktanıza 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 olduğunuzdan emin 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. Ardından, örneğin, uç noktanız doğrulama jetonlarını yalnızca kaydederek işliyorsa jetonun alındığını onaylamak için günlüklerinizi inceleyebilirsiniz.
Hata kodu referansı
RISC API'si 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 alanını ekleyin. |
401 | Yetkilendirilmedi. | Yetkilendirme başarısız oldu. İsteğe yetkilendirme jetonu eklediğinizden, jetonun geçerli olduğundan ve süresinin dolmadığından emin olun. |
403 | Teslimat uç noktası bir HTTPS URL'si olmalıdır. | Teslimat uç noktanız (yani RISC etkinliklerinin teslim edilmesini beklediğiniz uç nokta) HTTPS olmalıdır. RISC etkinliklerini HTTP URL'lerine göndermeyiz. |
403 | Mevcut akış yapılandırmasında RISC için spesifikasyona uygun yayınlama yöntemi yok. | Google Cloud projenizde önceden bir RISC yapılandırması olmalıdır. Firebase'i kullanıyorsanız ve Google ile Giriş'i 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 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. Silinmiş bir projeyle ilişkili 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şmek için izne ihtiyacı var. | Projenize gidin API Console ve
"RISC Yapılandırma Yöneticisi" rolünü
(roles/riscconfigs.admin )
buradaki talimatları uygulayarak projenize çağrı yapan 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ı ile Google API'lerini çağırma hakkında daha fazla bilgi edinin. |
403 | Teslimat uç noktası, projenizin alanlarından hiçbirine ait değil. | Her projenin bir dizi yetkili alanı vardır. Teslimat uç noktanız (yani RISC etkinliklerinin teslim edilmesini beklediğiniz uç nokta) bunlardan birinde barındırılmıyorsa uç noktanın alan adı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 özelliğini destekleyen bir uygulama oluşturursanız çalışır. Bu bağlantı için bir OAuth istemcisi gerekir. Projenizde OAuth istemcisi yoksa RISC'in sizin için yararlı olması olası değildir. Google'ın API'lerimiz için OAuth kullanım şekli 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. Projenin mevcut bir RISC yapılandırması yok, durum güncellenemiyor. |
Yeni bir 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'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ümüze göz atın. Sorularınız varsa bunları Stack Overflow'da #SecEvents etiketiyle yayınlayabilirsiniz.