Google стремится продвигать расовое равенство для чернокожих сообществ. Смотри как.

Защитите учетные записи пользователей с помощью защиты перекрестных учетных записей

Если ваше приложение позволяет пользователям входить в свои учетные записи с помощью Google, вы можете повысить безопасность этих общих учетных записей пользователей, прослушивая и отвечая на уведомления о событиях безопасности, предоставляемые службой защиты перекрестных учетных записей.

Эти уведомления предупреждают вас о серьезных изменениях в учетных записях Google ваших пользователей, которые часто также могут иметь последствия для безопасности их учетных записей в вашем приложении. Например, если учетная запись Google пользователя была взломана, это потенциально может привести к компрометации учетной записи пользователя с вашим приложением посредством восстановления учетной записи электронной почты или использования единого входа.

Чтобы помочь вам снизить потенциальный риск таких событий, Google отправляет ваши служебные объекты, называемые токенами событий безопасности. Эти токены предоставляют очень мало информации - только тип события безопасности и время его возникновения, а также идентификатор затронутого пользователя, - но вы можете использовать их, чтобы предпринять соответствующие действия в ответ. Например, если учетная запись Google пользователя была взломана, вы можете временно отключить вход в Google для этого пользователя и предотвратить отправку писем для восстановления учетной записи на адрес Gmail пользователя.

Межаккаунтная защита основана на стандарте RISC , разработанном OpenID Foundation.

Обзор

Чтобы использовать защиту между учетными записями с вашим приложением или службой, вы должны выполнить следующие задачи:

  1. Настройте свой проект в API Console.

  2. Создайте конечную точку приемника событий, на которую Google будет отправлять токены событий безопасности. Эта конечная точка отвечает за проверку токенов, которые она получает, а затем за реакцию на события безопасности любым способом, который вы выберете.

  3. Зарегистрируйте свою конечную точку в Google, чтобы начать получать токены событий безопасности.

Предпосылка

Вы получаете токены событий безопасности только для пользователей Google, которые предоставили вашей службе разрешение на доступ к информации своего профиля или адресам электронной почты. Вы получаете это разрешение, запрашивая profile или email . SDK для входа в Google запрашивают эти области по умолчанию, но если вы не используете настройки по умолчанию или напрямую обращаетесь к конечной точке Google OpenID Connect , убедитесь, что вы запрашиваете хотя бы одну из этих областей.

Настроить проект в API Console

Прежде чем вы сможете начать получать токены событий безопасности, вы должны создать учетную запись службы и включить RISC API в своем проекте API Console. Вы должны использовать тот же проект API Console, который вы используете для доступа к службам Google, таким как Google Sign-in, в своем приложении.

Чтобы создать учетную запись службы:

  1. Откройте API Console Credentials page . При появлении запроса выберите проект API Console, который вы используете для доступа к службам Google в своем приложении.

  2. Щелкните Создать учетные данные> Ключ учетной записи службы .

  3. Создайте новую учетную запись службы с ролью редактора.

    Выберите тип ключа JSON и нажмите « Создать» . Когда ключ будет создан, вы загрузите файл JSON, содержащий учетные данные вашей учетной записи службы. Храните этот файл в надежном месте, но также доступным для конечной точки приемника событий.

Находясь на странице учетных данных своего проекта, также обратите внимание на идентификаторы клиентов, которые вы используете для входа в Google. Обычно у вас есть идентификатор клиента для каждой поддерживаемой платформы. Эти идентификаторы клиентов понадобятся вам для проверки токенов событий безопасности, как описано в следующем разделе.

Чтобы включить RISC API:

  1. Откройте страницу RISC API в файле API Console. Убедитесь, что проект, который вы используете для доступа к сервисам Google, по-прежнему выбран.

  2. Прочтите Условия RISC и убедитесь, что вы понимаете требования.

    Если вы включаете API для проекта, принадлежащего организации, убедитесь, что у вас есть полномочия на привязку вашей организации к Условиям RISC.

  3. Щелкните Включить, только если вы согласны с Условиями RISC.

Создание конечной точки приемника событий

Чтобы получать уведомления о событиях безопасности от Google, вы создаете конечную точку HTTPS, которая обрабатывает запросы HTTPS POST. После того, как вы зарегистрируете эту конечную точку (см. Ниже), Google начнет отправлять на конечную точку строки с криптографической подписью, называемые токенами событий безопасности. Токены событий безопасности - это подписанные JWT, которые содержат информацию об одном событии, связанном с безопасностью.

Для каждого токена события безопасности, который вы получаете на своей конечной точке, сначала проверьте и декодируйте токен, а затем обработайте событие безопасности в соответствии с вашей службой. В следующих разделах описываются эти задачи:

1. Расшифруйте и подтвердите токен события безопасности.

Поскольку токены событий безопасности представляют собой особый вид JWT, вы можете использовать любую библиотеку JWT, например, указанную на jwt.io , для их декодирования и проверки. Какую бы библиотеку вы ни использовали, ваш код проверки токена должен делать следующее:

  1. Получите идентификатор эмитента ( issuer ) защиты кросс-аккаунтов и URI сертификата ключа подписи ( jwks_uri ) из документа конфигурации Google RISC, который вы можете найти по адресу https://accounts.google.com/.well-known/risc-configuration .
  2. Используя выбранную вами библиотеку JWT, получите идентификатор ключа подписи из заголовка токена события безопасности.
  3. Из документа сертификата ключа подписи Google получите открытый ключ с идентификатором ключа, полученным на предыдущем шаге. Если документ не содержит ключа с идентификатором, который вы ищете, вероятно, токен события безопасности недействителен, и ваша конечная точка должна вернуть ошибку HTTP 400.
  4. Используя выбранную вами библиотеку JWT, проверьте следующее:
    • Маркер события безопасности подписывается с использованием открытого ключа, полученного на предыдущем шаге.
    • aud для токена - это один из идентификаторов клиента вашего приложения.
    • Утверждение iss для токена совпадает с идентификатором эмитента, полученным из документа обнаружения RISC. Обратите внимание, что вам не нужно проверять истечение срока действия токена ( exp ), поскольку токены событий безопасности представляют собой исторические события и, как таковые, не имеют срока действия.

Например:

Ява

Использование 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 . Когда subject_type иска является id_token_claims , он может также включать в себя email поле с адресом электронной почты пользователя.

Используйте информацию в заявлении о events чтобы предпринять соответствующие действия для данного типа события в учетной записи указанного пользователя.

Поддерживаемые типы событий

Межаккаунтная защита поддерживает следующие типы событий безопасности:

Тип события Атрибуты Как ответить
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/risc/event-type/account-disabled reason=hijacking ,
reason=bulk-account

Обязательно : если учетная запись была отключена по причине hijacking , повторно защитите учетную запись пользователя, завершив текущие открытые сеансы.

Предлагается : если причиной отключения учетной записи была 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-purged Предлагается : удалите учетную запись пользователя или предоставьте ему альтернативный метод входа.
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, которые могут помочь вам выполнить де-дублирование потока данных.

Обратите внимание, что события доставляются с ограниченным числом повторных попыток, поэтому, если ваш приемник не работает в течение длительного периода времени, вы можете навсегда пропустить некоторые события.

Зарегистрируйте свой ресивер

Чтобы начать получать события безопасности, зарегистрируйте конечную точку получателя с помощью RISC API. Вызовы RISC API должны сопровождаться токеном авторизации.

Вы будете получать события безопасности только для пользователей вашего приложения, поэтому вам необходимо настроить экран согласия 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-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.

Теперь, когда у вас есть токен авторизации, вы можете использовать RISC API для настройки потока событий безопасности вашего проекта, включая регистрацию конечной точки получателя.

Для этого отправьте 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
  ]
}

Например:

Ява

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 не отправляет события на вашу конечную точку и не буферизует события безопасности, когда они происходят. Чтобы повторно { "status": "enabled" } поток событий, выполните POST { "status": "enabled" } к той же конечной точке.

3. Необязательно: проверьте конфигурацию потока.

Вы можете убедиться, что конфигурация вашего потока и конечная точка получателя работают вместе правильно, отправив токен подтверждения через поток событий. Этот токен может содержать уникальную строку, которую вы можете использовать для проверки того, что токен был получен в вашей конечной точке.

Чтобы запросить токен подтверждения, отправьте авторизованный запрос HTTPS POST по https://risc.googleapis.com/v1beta/stream:verify . В теле запроса укажите некоторую идентифицирующую строку:

{
  "state": "ANYTHING"
}

Например:

Ява

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()))

Если запрос завершится успешно, токен подтверждения будет отправлен на зарегистрированную вами конечную точку. Затем, например, если ваша конечная точка обрабатывает токены проверки, просто регистрируя их, вы можете проверить свои журналы, чтобы подтвердить, что токен был получен.

Ссылка на код ошибки

RISC API может возвращать следующие ошибки:

Код ошибки Сообщение об ошибке Предложенные действия
400 Конфигурация потока должна содержать поле $ fieldname . Ваш запрос к конечной точке https://risc.googleapis.com/v1beta/stream:update недействителен или не может быть проанализирован. Пожалуйста, включите $ fieldname в свой запрос.
401 Несанкционированный. Авторизация не удалась. Убедитесь, что вы приложили токен авторизации к запросу и что токен действителен и не просрочен.
403 Конечная точка доставки должна быть URL-адресом HTTPS. Конечная точка доставки (т. Е. Конечная точка, на которую должны доставляться события RISC) должна быть HTTPS. Мы не отправляем события RISC по URL-адресам HTTP.
403 В существующей конфигурации потока нет соответствующего спецификации метода доставки для RISC. У вашего проекта Google Cloud уже должна быть конфигурация RISC. Если вы используете Firebase и у вас включен вход через Google, тогда Firebase будет управлять RISC для вашего проекта; вы не сможете создать собственную конфигурацию. Если вы не используете Google Sign-In для своего проекта Firebase, отключите его, а затем повторите попытку обновления через час.
403 Проект не найден. Убедитесь, что вы используете правильную учетную запись службы для правильного проекта. Возможно, вы используете учетную запись службы, связанную с удаленным проектом. Узнайте, как просмотреть все учетные записи служб, связанные с проектом .
403 У учетной записи службы должны быть разрешения редактора в вашем проекте. Перейдите в консоль Google Cloud Platform вашего проекта и предоставьте учетной записи службы, которая выполняет вызовы редактора / владельца, разрешение на ваш проект, следуя этим инструкциям .
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 .