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 hakkında sizi uyarır. Bu değişiklikler genellikle kullanıcıların uygulamanızdaki hesapları için de güvenlik açısından önemli olabilir. Örneğin, bir kullanıcının Google Hesabı ele geçirilirse e-posta hesabı kurtarma veya tek oturum açma kullanımı yoluyla kullanıcının uygulamanızdaki hesabı da tehlikeye girebilir.
Google, bu tür olayların risk potansiyelini azaltmanıza yardımcı olmak için hizmetinize güvenlik işlemi jetonları adı verilen nesneler gönderir. Bu jetonlar çok az bilgi gösterir (yalnızca güvenlik işleminin türü, ne zaman gerçekleştiği ve etkilenen kullanıcının tanımlayıcısı). Ancak bu jetonları kullanarak uygun işlemi yapabilirsiniz. Örneğin, bir kullanıcının Google Hesabı ele geçirilirse o 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ını temel alır.
Genel Bakış
Uygulamanızda veya hizmetinizde Hesaplar Arası Koruma'yı kullanmak için aşağıdaki görevleri tamamlamanız gerekir:
API Konsolu'nda projenizi oluşturun.
Google'ın güvenlik işlemi jetonları göndereceği bir etkinlik alıcısı uç noktası oluşturun. Bu uç nokta, aldığı jetonları doğrulamaktan ve ardından güvenlik işlemlerine seçtiğiniz şekilde yanıt vermekten sorumludur.
Güvenlik işlemi 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şim izni veren Google kullanıcıları için güvenlik işlemi jetonları alırsınız. Bu izni, profile veya email kapsamlarını isteyerek alırsınız. Daha yeni olan Google ile oturum açma veya eski Google ile oturum açma SDK'ları bu kapsamları varsayılan olarak ister. Ancak varsayılan ayarları kullanmıyorsanız veya Google'ın OpenID Connect uç noktasına doğrudan erişiyorsanız bu kapsamlardan en az birini istediğinizden emin olun.
API Konsolu'nda proje oluşturma
Güvenlik işlemi jetonlarını almaya başlamadan önce bir hizmet hesabı oluşturmanız ve API Konsolu projenizde RISC API'yi etkinleştirmeniz gerekir. Uygulamanızda Google ile Oturum Açma gibi Google hizmetlerine erişmek için kullandığınız API Console projesini kullanmanız gerekir.
Hizmet hesabını oluşturmak için:
API Konsolu Kimlik Bilgileri sayfasını açın. İstendiğinde, uygulamanızda Google hizmetlerine erişmek için kullandığınız API Console projesini seçin.
Kimlik bilgileri oluştur > Hizmet hesabı'nı tıklayın.
Bu talimatları uygulayarak RISC Yapılandırma Yöneticisi rolüne (
roles/riscconfigs.admin) sahip yeni bir hizmet hesabı oluşturun.(İsteğe bağlı) Google Cloud kuruluşunuz hizmet hesabı anahtarı oluşturulmasına izin veriyorsa ve JWT'leri yerel olarak imzalamayı planlıyorsanız 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ç noktanızın da erişebileceği bir yerde olsun.
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:
API Konsolu'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.
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 yetkiniz 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 etkinlik bildirimi 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 göndermeye başlar. Güvenlik işlemi jetonları, güvenlikle ilgili tek bir işlem hakkında bilgi içeren imzalı JWT'lerdir.
Uç noktanızda aldığınız her güvenlik işlemi jetonunu önce doğrulayıp kodunu çözün, ardından güvenlik işlemini hizmetinize uygun şekilde işleyin. Kötü niyetli kişilerin saldırılarını önlemek için kod çözme işleminden önce etkinlik jetonunun doğrulanması gerekir. 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 işlemi jetonları belirli bir JWT türü olduğundan, bunların kodunu çözmek ve doğrulamak için jwt.io adresinde listelenenler gibi herhangi bir JWT kitaplığını kullanabilirsiniz. Kullandığınız kitaplık hangisi olursa olsun, jeton doğrulama kodunuzun aşağıdakileri yapması gerekir:
- Google'ın RISC yapılandırma dokümanından Hesaplar Arası Koruma veren tanımlayıcısını (
issuer) ve imzalama anahtarı sertifikası URI'sini (jwks_uri) alın. Dokümanıhttps://accounts.google.com/.well-known/risc-configurationadresinde 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 işlemi jetonu muhtemelen geçersizdir ve uç noktanız HTTP 400 hatası 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
audtalebi, uygulamalarınızın istemci kimliklerinden biridir. - Jetonun
isstalebi, RISC keşif belgesinden aldığınız veren tanımlayıcısıyla eşleşir. Güvenlik işlemi jetonları geçmişteki etkinlikleri temsil ettiğinden ve bu nedenle süresi dolmadığından jetonun geçerlilik süresini (exp) doğrulamanız gerekmez.
Ö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 durum kodu 202'yi döndürün. Ardından, jetonla belirtilen güvenlik işlemini gerçekleştirin.
2. Güvenlik işlemlerini yönetme
Kodu çözüldüğünde, güvenlik işlemi 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 talepleri, jetonun vericisini (Google) ve jetonun amaçlanan alıcısını (hizmetiniz) belirtir. Önceki adımda bu hak taleplerini doğruladınız.
jti talebi, tek bir güvenlik işlemini tanımlayan ve akışa özgü olan bir dizedir. Hangi güvenlik işlemlerini aldığınızı takip etmek için bu tanımlayıcıyı kullanabilirsiniz.
events talebi, jetonun temsil ettiği güvenlik işlemiyle ilgili bilgileri içerir. Bu talep, bir etkinlik türü tanımlayıcısının bir subject
talebiyle ve etkinlikle ilgili mevcut olabilecek diğer
ayrıntılarla eşlenmesidir. talebi, bu etkinliğin hangi kullanıcıyla ilgili olduğunu belirtir.
subject talebi, belirli bir kullanıcıyı kullanıcının 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 değeri id_token_claims olduğunda, kullanıcının e-posta adresini içeren bir email alanı da bulunabilir.
Belirtilen kullanıcının hesabındaki etkinlik türü için uygun işlemi yapmak üzere events talebindeki bilgileri kullanın.
OAuth jetonu tanımlayıcıları
Bireysel jetonlarla ilgili OAuth etkinlikleri için jeton konusu tanımlayıcı türü aşağıdaki alanları içerir:
token_type: Yalnızcarefresh_tokendesteklenir.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 karma oluşturma işlemi. |
Bu etkinliklerle entegrasyon yaparsanız etkinlik alındığında hızlı bir eşleşme sağlamak için jetonlarınızı bu olası değerlere göre dizine eklemeniz önerilir.
Desteklenen etkinlik türleri
Hesaplar Arası Koruma, aşağıdaki güvenlik işlemi türlerini destekler:
| Etkinlik Türü | Özellikler | Nasıl karşılık vermeli? |
|---|---|---|
https://schemas.openid.net/secevent/risc/event-type/sessions-revoked |
Zorunlu: Kullanıcının açık olan 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çin kullanılıyorsa kullanıcının 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ından herhangi birini silin. |
|
https://schemas.openid.net/secevent/oauth/event-type/token-revoked |
Jeton tanımlayıcıları için OAuth jeton 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 tekrar 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: Hesabın devre dışı bırakılma nedeni Önerilen: Herhangi bir neden belirtilmediyse kullanıcı için Google ile Oturum Açma'yı devre dışı bırakın ve kullanıcının Google Hesabı ile ilişkili e-posta adresini (genellikle bir Gmail hesabı, ancak zorunlu değil) kullanarak hesap kurtarmayı devre dışı bırakın. Kullanıcıya alternatif bir oturum açma yöntemi sunun. |
https://schemas.openid.net/secevent/risc/event-type/account-enabled |
Önerilen: Kullanıcı için Google ile Oturum Açma'yı yeniden etkinleştirin ve kullanıcının Google Hesabı e-posta adresiyle hesap kurtarmayı yeniden etkinleştirin. | |
https://schemas.openid.net/secevent/risc/event-type/account-credential-change-required |
Önerilen: Hizmetinizdeki şüpheli etkinlikleri takip edin ve uygun işlemi yapın. | |
https://schemas.openid.net/secevent/risc/event-type/verification |
state=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 teslim etmeye çalışır. Bu nedenle, bazen aynı etkinliği birden çok kez alabilirsiniz. Bu durum, kullanıcılarınızı rahatsız edecek tekrarlanan işlemlere neden oluyorsa etkinlikleri tekilleştirmek için jti talebini (bir etkinliğin benzersiz tanımlayıcısıdır) 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ı sayıda yeniden denemeyle gönderildiğini unutmayın. Bu nedenle, alıcınız uzun bir süre boyunca çalışmazsa bazı etkinlikleri kalıcı olarak kaçırabilirsiniz.
Alıcınızı kaydetme
Güvenlik işlemlerini almaya başlamak için RISC API'yi kullanarak alıcı uç noktanızı kaydedin. RISC API'ye yapılan çağrılar bir yetkilendirme jetonu içermelidir.
Yalnızca uygulamanızın kullanıcıları için güvenlik işlemleri alırsınız. Bu nedenle, aşağıda açıklanan adımların ön koşulu olarak GCP projenizde yapılandırılmış bir OAuth kullanıcı rızası ekranınızın olması gerekir.
1. Yetkilendirme jetonu oluşturma
RISC API için yetkilendirme jetonunu, hizmet hesabı kimliğine bürünme ile Google Cloud CLI (gcloud) kullanarak (iam.disableServiceAccountKeyCreation zorunlu kılındığında veya tek seferlik CLI kurulumu için önerilir) ya da bir JWT'yi hizmet hesabı özel anahtarıyla yerel olarak imzalayarak oluşturabilirsiniz.
A seçeneği: gcloud kullanarak kısa süreli erişim jetonu oluşturma (JSON anahtarı gerekmez)
Kullanıcı hesabınızın hizmet hesabında Hizmet Hesabı Jetonu Oluşturucu rolü (roles/iam.serviceAccountTokenCreator) varsa doğrudan terminalinizden gerekli RISC yapılandırma kapsamına sahip kısa süreli bir OAuth 2.0 erişim jetonu oluşturabilirsiniz:
AUTH_TOKEN=$(gcloud auth print-access-token \
--impersonate-service-account=SERVICE_ACCOUNT_EMAIL \
--scopes=https://www.googleapis.com/auth/risc.configuration.readwrite,https://www.googleapis.com/auth/risc.verify,https://www.googleapis.com/auth/risc.status.readwrite)
RISC API için kullanılabilen OAuth 2.0 kapsamları hakkında daha fazla bilgi edinmek üzere Erişim Jetonu Kapsamları bölümüne bakın.
B seçeneği: Hizmet hesabı anahtarı kullanarak kendi kendine imzalanmış bir JWT oluşturma
Alternatif olarak, ağ gidiş dönüşü olmadan yerel olarak bir yetkilendirme jetonu oluşturmak için aşağıdaki hak taleplerini 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ırma API'sini çağırma
Yetkilendirme jetonunuz olduğuna göre, alıcı uç noktanızı kaydetme de dahil olmak üzere projenizin güvenlik işlemi akışını yapılandırmak için RISC API'yi kullanabilirsiniz.
Bunun için alıcı uç noktanızı ve ilgilendiğiniz güvenlik işlemi türlerini belirterek https://risc.googleapis.com/v1beta/stream:update adresine 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 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şlar. 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 yayın yapılandırmanızı alma ve güncelleme
Gelecekte akış yapılandırmanızı değiştirmek isterseniz mevcut akış yapılandırmasını almak için https://risc.googleapis.com/v1beta/stream adresine yetkili bir GET isteği gönderip yanıt gövdesini değiştirerek ve ardından değiştirilen yapılandırmayı yukarıda açıklandığı gibi https://risc.googleapis.com/v1beta/stream:update adresine POST ederek bunu yapabilirsiniz.
Etkinlik akışını durdurma ve devam ettirme
Google'dan gelen etkinlik akışını durdurmanız gerekirse istek gövdesinde { "status": "disabled" } olacak şekilde https://risc.googleapis.com/v1beta/stream/status:update adresine yetkili bir POST isteği gönderin. Akış devre dışı bırakıldığında Google, uç noktanıza etkinlik göndermez ve güvenlik işlemleri 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ı: Akış yapılandırmanızı test etme
Etkinlik akışınız üzerinden bir doğrulama jetonu göndererek akış yapılandırmanızın ve alıcı uç noktanızın birlikte doğru ş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 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 günlüğe kaydederek işliyorsa jetonun alındığını onaylamak için günlüklerinizi inceleyebilirsiniz.
Hata kodu referansı
RISC API aşağıdaki hataları döndürebilir:
| Hata Kodu | Hata Mesajı | Önerilen İşlemler |
|---|---|---|
| 400 | Akış yapılandırması $fieldname alanını içermelidir. | https://risc.googleapis.com/v1beta/stream:update uç noktasına gönderdiğiniz 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 bir yetkilendirme jetonu eklediğinizden ve 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 etkinlikleri HTTP URL'lerine gönderilmez. |
| 403 | Mevcut akış yapılandırmasında RISC için spesifikasyona 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 etkinse projeniz için RISC'yi Firebase 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 bu özelliği 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şmek için izne ihtiyacı var. | Projenizin API Console'una 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 | Yayın yönetimi API'leri yalnızca bir hizmet hesabı tarafından çağrılmalıdır. | Google API'lerini hizmet hesabı kullanarak nasıl çağırabileceğiniz hakkında daha fazla bilgi edinin. |
| 403 | Teslimat uç noktası, projenizin alanlarından hiçbirine ait değil. | Her projenin bir yetkili alan adı grubu vardır. Teslimat uç noktanız (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 istemcisinin yapılandırılmış olması gerekir. | RISC yalnızca Google ile Oturum Açma'yı destekleyen bir uygulama oluşturursanız çalışır. Bu bağlantı için bir OAuth istemcisi gerekir. Projenizde OAuth istemcisi yoksa RISC'nin size faydası olmayabilir. Google'ın API'lerimiz için OAuth'u nasıl kullandığı 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 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ı kontrol edin. |
Erişim jetonu kapsamları
RISC API'de kimlik doğrulaması için erişim jetonlarını 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üzü inceleyin. Hâlâ sorularınız varsa bunları Stack Overflow'da #SecEvents etiketiyle yayınlayın.