Google s'est engagé à promouvoir l'équité raciale pour les communautés noires. Regarde comment.

Protégez les comptes utilisateurs avec la protection multicompte

Si votre application permet aux utilisateurs de se connecter à leurs comptes à l'aide de Google, vous pouvez améliorer la sécurité des comptes de ces utilisateurs partagés en écoutant et en répondant aux notifications d'événements de sécurité fournies par le service de protection multicompte.

Ces notifications vous alertent des changements majeurs apportés aux comptes Google de vos utilisateurs, ce qui peut souvent avoir des implications sur la sécurité de leurs comptes avec votre application. Par exemple, si le compte Google d'un utilisateur était piraté, cela pourrait potentiellement conduire à une compromission du compte de l'utilisateur avec votre application via la récupération du compte de messagerie ou l'utilisation de l'authentification unique.

Pour vous aider à atténuer le potentiel de risque de tels événements, Google envoie vos objets de service appelés jetons d'événement de sécurité. Ces jetons exposent très peu d'informations (uniquement le type d'événement de sécurité et le moment où il s'est produit, ainsi que l'identifiant de l'utilisateur concerné), mais vous pouvez les utiliser pour prendre les mesures appropriées en réponse. Par exemple, si le compte Google d'un utilisateur était compromis, vous pourriez désactiver temporairement la connexion à Google pour cet utilisateur et empêcher l'envoi d'e-mails de récupération de compte à l'adresse Gmail de l'utilisateur.

La protection croisée est basée sur la norme RISC , développée par la Fondation OpenID.

Aperçu

Pour utiliser la protection multicompte avec votre application ou service, vous devez effectuer les tâches suivantes:

  1. Configurez votre projet dans le API Console.

  2. Créez un point de terminaison de récepteur d'événements, auquel Google enverra des jetons d'événements de sécurité. Ce point de terminaison est chargé de valider les jetons qu'il reçoit, puis de répondre aux événements de sécurité de la manière que vous choisissez.

  3. Enregistrez votre point de terminaison auprès de Google pour commencer à recevoir des jetons d'événement de sécurité.

Prérequis

Vous ne recevez des jetons d'événement de sécurité que pour les utilisateurs Google qui ont autorisé votre service à accéder aux informations de leur profil ou à leurs adresses e-mail. Vous obtenez cette autorisation en demandant le profile ou les portées d' email - email . La connexion Google SDKs demande ces champs par défaut, mais si vous n'utilisez pas les paramètres par défaut, ou si vous accédez à Google OpenID Connect point final directement, assurez -vous que vous demandez au moins un de ces champs d' application.

Mettre en place un projet dans le API Console

Avant de pouvoir commencer à recevoir des jetons d'événement de sécurité, vous devez créer un compte de service et activer l'API RISC dans votre projet API Console. Vous devez utiliser le même projet API Console que vous utilisez pour accéder aux services Google, tels que Google Sign-in, dans votre application.

Pour créer le compte de service:

  1. Ouvrez le API Console Credentials page . Lorsque vous y êtes invité, choisissez le projet API Console que vous utilisez pour accéder aux services Google dans votre application.

  2. Cliquez sur Créer des informations d'identification> Clé de compte de service .

  3. Créez un nouveau compte de service avec le rôle Éditeur.

    Choisissez le type de clé JSON, puis cliquez sur Créer . Une fois la clé créée, vous téléchargerez un fichier JSON contenant les informations d'identification de votre compte de service. Conservez ce fichier dans un endroit sûr, mais également accessible à votre point de terminaison de récepteur d'événements.

Lorsque vous êtes sur la page des informations d'identification de votre projet, notez également les ID client que vous utilisez pour la connexion à Google. En règle générale, vous disposez d'un ID client pour chaque plateforme que vous prenez en charge. Vous aurez besoin de ces ID client pour valider les jetons d'événement de sécurité, comme décrit dans la section suivante.

Pour activer l'API RISC:

  1. Ouvrez la page API RISC dans le API Console. Assurez-vous que le projet que vous utilisez pour accéder aux services Google est toujours sélectionné.

  2. Lisez les conditions du RISC et assurez-vous de bien comprendre les exigences.

    Si vous activez l'API pour un projet appartenant à une organisation, assurez-vous que vous êtes autorisé à lier votre organisation aux conditions RISC.

  3. Cliquez sur Activer uniquement si vous acceptez les conditions RISC.

Créer un point de terminaison de récepteur d'événements

Pour recevoir des notifications d'événements de sécurité de Google, vous créez un point de terminaison HTTPS qui gère les demandes HTTPS POST. Une fois que vous avez enregistré ce point de terminaison (voir ci-dessous), Google commencera à publier des chaînes signées cryptographiquement appelées jetons d'événement de sécurité sur le point de terminaison. Les jetons d'événement de sécurité sont des JWT signés qui contiennent des informations sur un seul événement lié à la sécurité.

Pour chaque jeton d'événement de sécurité que vous recevez sur votre point de terminaison, commencez par valider et décoder le jeton, puis gérez l'événement de sécurité en fonction de votre service. Les sections suivantes décrivent ces tâches:

1. Décodez et validez le jeton d'événement de sécurité

Les jetons d'événement de sécurité étant un type spécifique de JWT, vous pouvez utiliser n'importe quelle bibliothèque JWT, telle que celle répertoriée sur jwt.io , pour les décoder et les valider. Quelle que soit la bibliothèque que vous utilisez, votre code de validation de jeton doit effectuer les opérations suivantes:

  1. Obtenez l'identifiant de l'émetteur de la protection multicompte ( issuer ) et l'URI du certificat de clé de signature ( jwks_uri ) dans le document de configuration RISC de Google, que vous pouvez trouver à l' https://accounts.google.com/.well-known/risc-configuration .
  2. À l'aide de la bibliothèque JWT de votre choix, obtenez l'ID de clé de signature dans l'en-tête du jeton d'événement de sécurité.
  3. À partir du document de certificat de clé de signature de Google, obtenez la clé publique avec l'ID de clé que vous avez obtenu à l'étape précédente. Si le document ne contient pas de clé avec l'ID que vous recherchez, il est probable que le jeton d'événement de sécurité ne soit pas valide et votre point de terminaison devrait renvoyer l'erreur HTTP 400.
  4. À l'aide de la bibliothèque JWT de votre choix, vérifiez les éléments suivants:
    • Le jeton d'événement de sécurité est signé à l'aide de la clé publique que vous avez obtenue à l'étape précédente.
    • La revendication aud du jeton est l'un des ID client de vos applications.
    • La revendication iss du jeton correspond à l'identifiant d'émetteur que vous avez obtenu du document de découverte RISC. Notez que vous n'avez pas besoin de vérifier l'expiration ( exp ) du jeton car les jetons d'événements de sécurité représentent des événements historiques et, en tant que tels, n'expirent pas.

Par example:

Java

Utilisation de java-jwt et 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)

Si le jeton est valide et a été décodé avec succès, renvoyez l'état HTTP 202. Ensuite, gérez l'événement de sécurité indiqué par le jeton.

2. Gérer les événements de sécurité

Une fois décodé, un jeton d'événement de sécurité ressemble à l'exemple suivant:

{
  "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"
    }
  }
}

Les revendications iss et aud indiquent l'émetteur du jeton (Google) et le destinataire prévu du jeton (votre service). Vous avez vérifié ces revendications à l'étape précédente.

La revendication jti est une chaîne qui identifie un événement de sécurité unique et est unique au flux. Vous pouvez utiliser cet identifiant pour suivre les événements de sécurité que vous avez reçus.

La revendication d' events contient des informations sur l'événement de sécurité représenté par le jeton. Cette revendication est un mappage d'un identificateur de type d'événement à une revendication de subject , qui spécifie l'utilisateur concerné par cet événement, et à tous les détails supplémentaires sur l'événement qui pourraient être disponibles.

La revendication en subject identifie un utilisateur particulier avec son ID de compte Google unique ( sub ). Cet identifiant est identique à l'identifiant contenu dans les jetons d'identification produits par Google Sign-in . Lorsque le subject_type de la revendication est id_token_claims , il peut également inclure un champ d' email avec l'adresse e-mail de l'utilisateur.

Utilisez les informations de la revendication d' events pour prendre les mesures appropriées pour le type d'événement sur le compte de l'utilisateur spécifié.

Types d'événements pris en charge

La protection entre comptes prend en charge les types d'événements de sécurité suivants:

Type d'événement Les attributs Comment répondre
https://schemas.openid.net/secevent/risc/event-type/sessions-revoked Obligatoire : sécurisez à nouveau le compte de l'utilisateur en mettant fin à ses sessions actuellement ouvertes.
https://schemas.openid.net/secevent/oauth/event-type/tokens-revoked

Obligatoire : si le jeton est destiné à la connexion à Google, mettez fin à leurs sessions actuellement ouvertes. En outre, vous souhaiterez peut-être suggérer à l'utilisateur de configurer une autre méthode de connexion.

Suggéré : si le jeton sert à accéder à d'autres API Google, supprimez tous les jetons OAuth de l'utilisateur que vous avez stockés.

https://schemas.openid.net/secevent/risc/event-type/account-disabled reason=hijacking ,
reason=bulk-account

Obligatoire : si la raison pour laquelle le compte a été désactivé était un hijacking , sécurisez à nouveau le compte de l'utilisateur en mettant fin à ses sessions actuellement ouvertes.

Suggéré : si la raison pour laquelle le compte a été désactivé était bulk-account , analysez l'activité de l'utilisateur sur votre service et déterminez les actions de suivi appropriées.

Suggéré : si aucune raison n'a été fournie, désactivez la connexion Google pour l'utilisateur et désactivez la récupération de compte à l'aide de l'adresse e-mail associée au compte Google de l'utilisateur (généralement, mais pas nécessairement, un compte Gmail). Offrez à l'utilisateur une autre méthode de connexion.

https://schemas.openid.net/secevent/risc/event-type/account-enabled Suggestion : réactivez la connexion Google pour l'utilisateur et réactivez la récupération du compte avec l'adresse e-mail du compte Google de l'utilisateur.
https://schemas.openid.net/secevent/risc/event-type/account-purged Suggéré : supprimez le compte de l'utilisateur ou fournissez-lui une autre méthode de connexion.
https://schemas.openid.net/secevent/risc/event-type/account-credential-change-required Suggéré : recherchez toute activité suspecte sur votre service et prenez les mesures appropriées.
https://schemas.openid.net/secevent/risc/event-type/verification état = state Suggéré : journal qu'un jeton de test a été reçu.

Événements dupliqués et manqués

La protection multicompte tentera de redistribuer les événements qui, selon elle, n'ont pas été livrés. Par conséquent, vous pouvez parfois recevoir le même événement plusieurs fois. Si cela peut entraîner des actions répétées qui gênent vos utilisateurs, envisagez d'utiliser la revendication jti (qui est un identifiant unique pour un événement) pour dédupliquer les événements. Il existe des outils externes tels que Google Cloud Dataflow qui peuvent vous aider à exécuter le flux de données de déduplication.

Notez que les événements sont livrés avec des tentatives limitées. Par conséquent, si votre récepteur est en panne pendant une période prolongée, vous pouvez manquer définitivement certains événements.

Enregistrez votre récepteur

Pour commencer à recevoir des événements de sécurité, enregistrez votre point de terminaison de récepteur à l'aide de l'API RISC. Les appels à l'API RISC doivent être accompagnés d'un jeton d'autorisation.

Vous ne recevrez des événements de sécurité que pour les utilisateurs de votre application. Par conséquent, vous devez configurer un écran de consentement OAuth dans votre projet GCP comme condition préalable aux étapes décrites ci-dessous.

1. Générez un jeton d'autorisation

Pour générer un jeton d'autorisation pour l'API RISC, créez un JWT avec les revendications suivantes:

{
  "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
}

Signez le JWT à l'aide de la clé privée de votre compte de service, que vous pouvez trouver dans le fichier JSON que vous avez téléchargé lors de la création de la clé de compte de service.

Par example:

Java

Utilisation de java-jwt et de la bibliothèque d'authentification de 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')

Ce jeton d'autorisation peut être utilisé pour effectuer des appels d'API RISC pendant une heure. Lorsque le jeton expire, générez-en un nouveau pour continuer à effectuer des appels d'API RISC.

2. Appelez l'API de configuration de flux RISC

Maintenant que vous disposez d'un jeton d'autorisation, vous pouvez utiliser l'API RISC pour configurer le flux d'événements de sécurité de votre projet, y compris l'enregistrement de votre point de terminaison de récepteur.

Pour ce faire, envoyez une requête HTTPS POST à https://risc.googleapis.com/v1beta/stream:update , en spécifiant votre point de terminaison de récepteur et les types d'événements de sécurité qui vous intéressent:

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
  ]
}

Par example:

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'])

Si la demande renvoie HTTP 200, le flux d'événements a été configuré avec succès et votre point de terminaison récepteur doit commencer à recevoir des jetons d'événements de sécurité. La section suivante décrit comment vous pouvez tester la configuration de votre flux et votre point de terminaison pour vérifier que tout fonctionne correctement ensemble.

Obtenez et mettez à jour votre configuration de flux actuelle

Si, à l'avenir, vous souhaitez modifier la configuration de votre flux, vous pouvez le faire en envoyant une requête GET autorisée à https://risc.googleapis.com/v1beta/stream pour obtenir la configuration actuelle du flux, en modifiant le corps de la réponse , puis POSTER la configuration modifiée sur https://risc.googleapis.com/v1beta/stream:update comme décrit ci-dessus.

Arrêter et reprendre le flux d'événements

Si vous devez arrêter le flux d'événements de Google, envoyez une requête POST autorisée à https://risc.googleapis.com/v1beta/stream/status:update avec { "status": "disabled" } dans le corps de la requête. Lorsque le flux est désactivé, Google n'envoie pas d'événements à votre point de terminaison et ne met pas en mémoire tampon les événements de sécurité lorsqu'ils se produisent. Pour réactiver le flux d'événements, POST { "status": "enabled" } sur le même point de terminaison.

3. Facultatif: testez la configuration de votre flux

Vous pouvez vérifier que la configuration de votre flux et le point de terminaison du récepteur fonctionnent correctement ensemble en envoyant un jeton de vérification via votre flux d'événements. Ce jeton peut contenir une chaîne unique que vous pouvez utiliser pour vérifier que le jeton a été reçu sur votre point de terminaison.

Pour demander un jeton de vérification, envoyez une demande HTTPS POST autorisée à https://risc.googleapis.com/v1beta/stream:verify . Dans le corps de la requête, spécifiez une chaîne d'identification:

{
  "state": "ANYTHING"
}

Par example:

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

Si la demande aboutit, le jeton de vérification sera envoyé au point de terminaison que vous avez enregistré. Ensuite, par exemple, si votre point de terminaison gère les jetons de vérification en les enregistrant simplement, vous pouvez examiner vos journaux pour confirmer que le jeton a été reçu.

Référence du code d'erreur

Les erreurs suivantes peuvent être renvoyées par l'API RISC:

Code d'erreur Message d'erreur Actions suggérées
400 La configuration du flux doit contenir le champ $ fieldname . Votre demande au point de terminaison https://risc.googleapis.com/v1beta/stream:update n'est pas valide ou ne peut pas être analysée. Veuillez inclure $ fieldname dans votre demande.
401 Non autorisé. L'autorisation à échouée. Assurez-vous que vous avez joint un jeton d'autorisation à la demande et que le jeton est valide et n'a pas expiré.
403 Le point de terminaison de livraison doit être une URL HTTPS. Votre point de terminaison de livraison (c'est-à-dire le point de terminaison auquel vous vous attendez à ce que les événements RISC soient livrés) doit être HTTPS. Nous n'envoyons pas d'événements RISC aux URL HTTP.
403 La configuration de flux existante n'a pas de méthode de livraison conforme aux spécifications pour RISC. Votre projet Google Cloud doit déjà avoir une configuration RISC. Si vous utilisez Firebase et que la connexion Google est activée, Firebase gérera RISC pour votre projet; vous ne pourrez pas créer de configuration personnalisée. Si vous n'utilisez pas Google Sign-In pour votre projet Firebase, désactivez-le, puis réessayez de mettre à jour après une heure.
403 Le projet est introuvable. Assurez-vous que vous utilisez le compte de service approprié pour le projet approprié. Vous utilisez peut-être un compte de service associé à un projet supprimé. Découvrez comment afficher tous les comptes de service associés à un projet .
403 Le compte de service doit disposer des autorisations d'éditeur dans votre projet. Accédez à la console Google Cloud Platform de votre projet et accordez au compte de service qui effectue les appels de l'éditeur / propriétaire des autorisations sur votre projet en suivant ces instructions .
403 Les API de gestion de flux ne doivent être appelées que par un compte de service. Voici plus d'informations sur la manière d'appeler les API Google avec un compte de service .
403 Le point de terminaison de livraison n'appartient à aucun des domaines de votre projet. Chaque projet a un ensemble de domaines autorisés. Si votre point de terminaison de livraison (c'est-à-dire le point de terminaison auquel vous prévoyez que les événements RISC seront livrés) n'est pas hébergé sur l'un d'eux, nous vous demandons d'ajouter le domaine du point de terminaison à cet ensemble.
403 Pour utiliser cette API, votre projet doit avoir au moins un client OAuth configuré. RISC ne fonctionne que si vous créez une application prenant en charge la connexion à Google . Cette connexion nécessite un client OAuth. Si votre projet n'a pas de clients OAuth, il est probable que RISC ne vous sera pas utile. En savoir plus sur l'utilisation d'OAuth par Google pour nos API .
403

État non pris en charge.

État non valide.

Nous ne prenons en charge que les statuts de flux « enabled » et « disabled » pour le moment.
404

Le projet n'a pas de configuration RISC.

Le projet n'a pas de configuration RISC existante, ne peut pas mettre à jour l'état.

Appelez le point de terminaison https://risc.googleapis.com/v1beta/stream:update pour créer une nouvelle configuration de flux.
4XX / 5XX Impossible de mettre à jour l'état. Consultez le message d'erreur détaillé pour plus d'informations.

Portées des jetons d'accès

Si vous décidez d'utiliser des jetons d'accès pour vous authentifier auprès de l'API RISC, voici les portées que votre application doit demander:

Point final Portée
https://risc.googleapis.com/v1beta/stream/status https://www.googleapis.com/auth/risc.status.readonly OU 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 OU 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

Besoin d'aide?

Tout d'abord, consultez notre section de référence de code d'erreur . Si vous avez encore des questions, postez-les sur Stack Overflow avec la balise #SecEvents .