Если ваше приложение позволяет пользователям входить в свои учетные записи с помощью Google, вы можете повысить безопасность этих общих учетных записей пользователей, отслеживая и реагируя на уведомления о событиях безопасности, предоставляемые службой защиты от межучетных записей.
Эти уведомления оповещают вас о важных изменениях в учетных записях Google ваших пользователей, которые часто могут иметь последствия для безопасности их учетных записей в вашем приложении. Например, если учетная запись Google пользователя будет взломана, это потенциально может привести к компрометации учетной записи пользователя в вашем приложении посредством восстановления электронной почты или использования единого входа.
Чтобы помочь вам снизить потенциальные риски подобных событий, Google отправляет вашим сервисам объекты, называемые токенами событий безопасности. Эти токены содержат очень мало информации — только тип события безопасности, время его возникновения и идентификатор пострадавшего пользователя, — но вы можете использовать их для принятия соответствующих мер в ответ. Например, если учетная запись Google пользователя была скомпрометирована, вы можете временно отключить функцию «Вход через Google» для этого пользователя и предотвратить отправку писем для восстановления учетной записи на адрес Gmail пользователя.
Защита от межсетевых атак основана на стандарте RISC , разработанном фондом OpenID.
Обзор
Для использования защиты от копирования между учетными записями в вашем приложении или сервисе необходимо выполнить следующие действия:
Настройте свой проект в API Console.
Создайте конечную точку обработки событий, на которую Google будет отправлять токены событий безопасности. Эта конечная точка отвечает за проверку полученных токенов и последующее реагирование на события безопасности любым выбранным вами способом.
Зарегистрируйте свою конечную точку в Google, чтобы начать получать токены событий безопасности.
Предварительное условие
Вы получаете токены событий безопасности только для пользователей Google, которые предоставили вашей службе разрешение на доступ к информации своего профиля или адресам электронной почты. Это разрешение вы получаете, запрашивая области действия profile или email . Более новые SDK для входа через Google или устаревшие SDK для входа через Google запрашивают эти области действия по умолчанию, но если вы не используете настройки по умолчанию или обращаетесь напрямую к конечной точке OpenID Connect от Google, убедитесь, что вы запрашиваете хотя бы одну из этих областей действия.
Создайте проект в API Console
Прежде чем начать получать токены событий безопасности, необходимо создать учетную запись службы и включить RISC API.API Console проект. Вы должны использовать тот же самый проект.API Console проект, который вы используете для доступа к сервисам Google, таким как вход через Google, в вашем приложении.
Для создания учетной записи службы:
Откройте API ConsoleCredentials page При появлении запроса выберитеAPI Consoleпроект, который вы используете для доступа к сервисам Google в вашем приложении.
Нажмите «Создать учетные данные» > «Учетная запись службы» .
Создайте новую учетную запись службы с ролью администратора конфигурации RISC (
roles/riscconfigs.admin), следуя этим инструкциям .Создайте ключ для вашей новой учетной записи службы. Выберите тип ключа JSON, а затем нажмите «Создать» . После создания ключа вы загрузите JSON-файл, содержащий учетные данные вашей учетной записи службы. Сохраните этот файл в безопасном месте, но так, чтобы он был доступен для вашей конечной точки обработки событий.
На странице «Учетные данные» вашего проекта также обратите внимание на идентификаторы клиентов, которые вы используете для входа через Google или входа через Google (устаревшая версия). Как правило, у вас есть идентификатор клиента для каждой поддерживаемой вами платформы. Эти идентификаторы клиентов понадобятся вам для проверки токенов событий безопасности, как описано в следующем разделе.
Для включения RISC API:
Откройте страницу RISC API вAPI ConsoleУбедитесь, что проект, который вы используете для доступа к сервисам Google, по-прежнему выбран.
Ознакомьтесь с условиями RISC и убедитесь, что вы понимаете требования.
Если вы активируете API для проекта, принадлежащего организации, убедитесь, что у вас есть полномочия привязать вашу организацию к условиям RISC.
Нажимайте кнопку «Включить» , только если вы согласны с условиями использования RISC.
Создайте конечную точку обработчика событий.
Для получения уведомлений о событиях безопасности от Google необходимо создать HTTPS-конечную точку, которая обрабатывает HTTPS POST-запросы. После регистрации этой конечной точки (см. ниже) Google начнет отправлять на нее криптографически подписанные строки, называемые токенами событий безопасности. Токены событий безопасности — это подписанные JWT-токены, содержащие информацию об одном событии, связанном с безопасностью.
Для каждого токена события безопасности, полученного на вашем конечном устройстве, сначала проверьте и расшифруйте токен, а затем обработайте событие безопасности соответствующим образом для вашей службы. Проверка токена события перед расшифровкой крайне важна для предотвращения вредоносных атак со стороны злоумышленников. В следующих разделах описаны эти задачи:
1. Расшифруйте и проверьте токен события безопасности.
Поскольку токены событий безопасности представляют собой особый тип JWT, для их декодирования и проверки можно использовать любую библиотеку JWT, например, ту, что указана на jwt.io. Независимо от используемой библиотеки, ваш код проверки токена должен выполнять следующие действия:
- Идентификатор эмитента для защиты от межсетевых атак (
issuer) и URI сертификата ключа подписи (jwks_uri) можно получить из документа конфигурации RISC от Google, который находится по адресуhttps://accounts.google.com/.well-known/risc-configuration. - Используя выбранную вами библиотеку JWT, получите идентификатор ключа подписи из заголовка токена события безопасности.
- Получите открытый ключ с идентификатором, полученным на предыдущем шаге, из документа сертификата подписи Google. Если документ не содержит ключ с нужным вам идентификатором, вероятно, токен события безопасности недействителен, и ваша конечная точка должна вернуть ошибку HTTP 400.
- Используя выбранную вами библиотеку JWT, проверьте следующее:
- Токен события безопасности подписывается с использованием открытого ключа, полученного на предыдущем шаге.
- Утверждение
audв токене — это один из идентификаторов клиента вашего приложения. - Указанное значение
issтокена совпадает с идентификатором эмитента, полученным из документа RISC discovery. Обратите внимание, что вам не нужно проверять срок действия токена (exp), поскольку токены событий безопасности представляют собой исторические события и, следовательно, не имеют срока действия.
Например:
Java
Использование java-jwt и jwks-rsa-java :
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)
Если токен действителен и был успешно декодирован, верните HTTP-статус 202. Затем обработайте событие безопасности, указанное в токене.
2. Обработка событий безопасности
В расшифрованном виде токен события безопасности выглядит следующим образом:
{
"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 и aud обозначают эмитента токена (Google) и предполагаемого получателя токена (ваш сервис). Вы проверили эти данные на предыдущем шаге.
Утверждение jti представляет собой строку, идентифицирующую отдельное событие безопасности и уникальную для данного потока. Вы можете использовать этот идентификатор для отслеживания полученных событий безопасности.
Утверждение events содержит информацию о событии безопасности, которое представляет токен. Это утверждение представляет собой сопоставление идентификатора типа события с утверждением subject , которое указывает пользователя, к которому относится это событие, а также с любыми дополнительными сведениями о событии, которые могут быть доступны.
Утверждение subject идентифицирует конкретного пользователя с помощью его уникального идентификатора учетной записи Google ( sub ). Этот идентификатор учетной записи Google совпадает с идентификатором ( sub ), содержащимся в токенах JWT, выдаваемых более новой библиотекой Sign In With Google ( Javascript , HTML ), устаревшей библиотекой Google Sign-in или OpenID Connect . Если subject_type утверждения равен id_token_claims , оно также может включать поле email с адресом электронной почты пользователя.
Используйте информацию из заявки на events , чтобы предпринять соответствующие действия для данного типа события в учетной записи указанного пользователя.
Идентификаторы токенов OAuth
Для событий OAuth, касающихся отдельных токенов, тип идентификатора субъекта токена содержит следующие поля:
token_type: Поддерживается толькоrefresh_token.token_identifier_alg: Возможные значения см. в таблице ниже.token: см. таблицу ниже.
| token_identifier_alg | токен |
|---|---|
prefix | Первые 16 символов токена. |
hash_base64_sha512_sha512 | Двойной хеш токена, полученный с использованием алгоритма SHA-512. |
При интеграции с этими событиями рекомендуется индексировать токены на основе этих возможных значений, чтобы обеспечить быстрое сопоставление при получении события.
Поддерживаемые типы событий
Функция защиты между учетными записями поддерживает следующие типы событий безопасности:
| Тип события | Атрибуты | Как ответить |
|---|---|---|
https://schemas.openid.net/secevent/risc/event-type/sessions-revoked | Обязательно : Обеспечьте безопасность учетной записи пользователя, завершив текущие открытые сессии. | |
https://schemas.openid.net/secevent/oauth/event-type/tokens-revoked | Обязательно : Если токен предназначен для входа через Google, завершите текущие открытые сессии. Кроме того, вы можете предложить пользователю настроить альтернативный способ входа. Рекомендация : Если токен предназначен для доступа к другим API Google, удалите все сохраненные вами токены OAuth пользователя. | |
https://schemas.openid.net/secevent/oauth/event-type/token-revoked | Идентификаторы токенов OAuth см. в разделе «Идентификаторы токенов». | Обязательно : Если вы сохранили соответствующий токен обновления, удалите его и запросите у пользователя повторное согласие при следующем запросе токена доступа. |
https://schemas.openid.net/secevent/risc/event-type/account-disabled | reason=hijacking ,reason=bulk-account | Обязательно : Если причиной блокировки учетной записи стало Рекомендация : Если причиной блокировки учетной записи стала Предложение : Если причина не указана, отключите вход через Google для пользователя и отключите возможность восстановления учетной записи с помощью адреса электронной почты, связанного с учетной записью Google пользователя (обычно, но не обязательно, это учетная запись Gmail). Предложите пользователю альтернативный способ входа. |
https://schemas.openid.net/secevent/risc/event-type/account-enabled | Рекомендуется : повторно включить вход через Google для пользователя и повторно включить восстановление учетной записи с помощью адреса электронной почты учетной записи Google пользователя. | |
https://schemas.openid.net/secevent/risc/event-type/account-credential-change-required | Рекомендуется : Следите за подозрительной активностью в вашей сети и принимайте соответствующие меры. | |
https://schemas.openid.net/secevent/risc/event-type/verification | состояние = state | Предлагается : Зарегистрировать получение тестового токена. |
Повторные и пропущенные события
Функция защиты от межсетевых атак попытается повторно доставить события, которые, по ее мнению, не были доставлены. Поэтому вы можете иногда получать одно и то же событие несколько раз. Если это может привести к повторным действиям, которые доставят неудобства вашим пользователям, рассмотрите возможность использования утверждения jti (уникального идентификатора события) для удаления дубликатов событий. Существуют внешние инструменты, такие как Google Cloud Dataflow , которые могут помочь вам выполнить удаление дубликатов данных.
Обратите внимание, что события доставляются с ограниченным количеством попыток, поэтому, если ваш приемник недоступен в течение длительного времени, вы можете навсегда пропустить некоторые события.
Зарегистрируйте свой приемник
Для начала получения событий безопасности зарегистрируйте конечную точку получателя, используя API RISC. Вызовы API RISC должны сопровождаться токеном авторизации.
Вы будете получать события безопасности только для пользователей вашего приложения, поэтому для выполнения описанных ниже шагов необходимо настроить экран согласия OAuth в вашем проекте GCP.
1. Сгенерируйте токен авторизации.
Для генерации токена авторизации для RISC API создайте JWT со следующими утверждениями:
{
"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
}Подпишите JWT, используя закрытый ключ вашей учетной записи службы, который вы можете найти в JSON-файле, загруженном вами при создании ключа учетной записи службы.
Например:
Java
Использование библиотеки java-jwt и библиотеки аутентификации Google :
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')
Этот авторизационный токен можно использовать для выполнения вызовов RISC API в течение одного часа. По истечении срока действия токена сгенерируйте новый, чтобы продолжить выполнение вызовов RISC API.
2. Вызов API конфигурации потока RISC.
Теперь, когда у вас есть токен авторизации, вы можете использовать API RISC для настройки потока событий безопасности вашего проекта, включая регистрацию конечной точки приемника.
Для этого отправьте HTTPS POST-запрос по адресу https://risc.googleapis.com/v1beta/stream:update , указав конечную точку получателя и типы событий безопасности, которые вас интересуют:
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
]
}
Например:
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'])
Если запрос возвращает HTTP 200, значит, поток событий успешно настроен, и ваша конечная точка получателя должна начать получать токены событий безопасности. В следующем разделе описано, как можно проверить конфигурацию потока и конечную точку, чтобы убедиться в корректной работе всех компонентов.
Получите и обновите текущую конфигурацию потока.
Если в будущем вам потребуется изменить конфигурацию потока, вы можете сделать это, отправив авторизованный GET-запрос по адресу https://risc.googleapis.com/v1beta/stream для получения текущей конфигурации потока, изменив тело ответа, а затем отправив измененную конфигурацию обратно по адресу https://risc.googleapis.com/v1beta/stream:update как описано выше.
Остановить и возобновить поток событий
Если вам когда-либо потребуется остановить поток событий от Google, отправьте авторизованный POST-запрос на адрес https://risc.googleapis.com/v1beta/stream/status:update с текстом { "status": "disabled" } в теле запроса. Пока поток деактивирован, Google не отправляет события на вашу конечную точку и не буферизует события безопасности при их возникновении. Чтобы повторно включить поток событий, отправьте POST-запрос { "status": "enabled" } на ту же конечную точку.
3. Дополнительно: Проверьте конфигурацию потока.
Вы можете убедиться в корректной работе конфигурации потока и конечной точки приемника, отправив токен подтверждения через поток событий. Этот токен может содержать уникальную строку, которую вы можете использовать для проверки получения токена на вашей конечной точке. Для использования этого процесса обязательно подпишитесь на тип события https://schemas.openid.net/secevent/risc/event-type/verification при регистрации приемника .
Для запроса токена подтверждения отправьте авторизованный HTTPS POST-запрос по адресу https://risc.googleapis.com/v1beta/stream:verify . В теле запроса укажите идентификационную строку:
{
"state": "ANYTHING"
}
Например:
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()))
Если запрос пройдет успешно, токен подтверждения будет отправлен на зарегистрированную вами конечную точку. Затем, например, если ваша конечная точка обрабатывает токены подтверждения, просто регистрируя их в логах, вы можете просмотреть свои логи, чтобы подтвердить получение токена.
Справочник кодов ошибок
API RISC может возвращать следующие ошибки:
| Код ошибки | Сообщение об ошибке | Рекомендуемые действия |
|---|---|---|
| 400 | В конфигурации потока должно содержаться поле `$fieldname` . | Ваш запрос к конечной точке https://risc.googleapis.com/v1beta/stream:update недействителен или не может быть обработан. Пожалуйста, добавьте $fieldname в свой запрос. |
| 401 | Несанкционировано. | Авторизация не удалась. Убедитесь, что вы прикрепили токен авторизации к запросу, что этот токен действителен и не истек. |
| 403 | Конечная точка доставки должна представлять собой URL-адрес с протоколом HTTPS. | Ваша конечная точка доставки (т.е. конечная точка, на которую вы ожидаете получения событий RISC) должна быть HTTPS. Мы не отправляем события RISC на HTTP-адреса. |
| 403 | Существующая конфигурация потока не предусматривает соответствующий спецификации метод доставки для RISC-архитектуры. | В вашем проекте Google Cloud уже должна быть конфигурация RISC. Если вы используете Firebase и у вас включен вход через Google, то Firebase будет управлять RISC для вашего проекта; вы не сможете создать пользовательскую конфигурацию. Если вы не используете вход через Google для своего проекта Firebase, пожалуйста, отключите его, а затем попробуйте обновить проект снова через час. |
| 403 | Проект не найден. | Убедитесь, что вы используете правильную учетную запись службы для правильного проекта. Возможно, вы используете учетную запись службы, связанную с удаленным проектом. Узнайте , как просмотреть все учетные записи служб, связанные с проектом . |
| 403 | Для доступа к конфигурации RISC-системы учетной записи службы необходимы соответствующие разрешения. | Перейдите в свой проект. API Console и назначьте роль "RISC Configuration Admin" ( roles/riscconfigs.admin ) учетной записи службы, которая выполняет вызовы к вашему проекту, следуя этим инструкциям . |
| 403 | API-интерфейсы управления потоками следует вызывать только из учетной записи службы. | Здесь вы найдете дополнительную информацию о том, как вызывать API Google с помощью сервисного аккаунта . |
| 403 | Точка доставки не принадлежит ни одному из доменов вашего проекта. | Каждый проект имеет набор авторизованных доменов. Если ваша конечная точка доставки (т.е. конечная точка, на которую вы ожидаете получать события RISC) не размещена ни на одном из них, мы требуем добавить домен этой конечной точки в этот набор. |
| 403 | Для использования этого API в вашем проекте должен быть настроен как минимум один клиент OAuth. | RISC работает только в том случае, если ваше приложение поддерживает вход через Google . Для этого требуется клиент OAuth. Если в вашем проекте нет клиентов OAuth, скорее всего, RISC вам не пригодится. Узнайте больше об использовании Google OAuth для наших API . |
| 403 | Неподдерживаемый статус. Неверный статус. | В настоящее время мы поддерживаем только статусы потока « enabled » и « disabled ». |
| 404 | В проекте отсутствует конфигурация RISC. В проекте отсутствует существующая конфигурация RISC, поэтому обновить статус невозможно. | Для создания новой конфигурации потока воспользуйтесь конечной точкой https://risc.googleapis.com/v1beta/stream:update . |
| 4XX/5XX | Не удалось обновить статус. | Для получения более подробной информации ознакомьтесь с подробным сообщением об ошибке. |
Области действия токенов доступа
Если вы решите использовать токены доступа для аутентификации в RISC API, ваше приложение должно запрашивать следующие области действия:
| Конечная точка | Объем |
|---|---|
https://risc.googleapis.com/v1beta/stream/status | https://www.googleapis.com/auth/risc.status.readonly ИЛИ 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 ИЛИ 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 |
Нужна помощь?
Для начала ознакомьтесь с разделом справочника кодов ошибок . Если у вас остались вопросы, задайте их на Stack Overflow, используя тег #SecEvents .