تلتزم Google بتعزيز المساواة العرقية في المجتمعات السوداء. أنظر كيف.

حماية حسابات المستخدمين مع Cross-Account Protection

إذا كان تطبيقك يتيح للمستخدمين تسجيل الدخول إلى حساباتهم باستخدام Google ، فيمكنك تحسين أمان حسابات هؤلاء المستخدمين المشتركين من خلال الاستماع إلى إشعارات أحداث الأمان المقدمة من خدمة Cross-Account Protection والرد عليها.

تنبهك هذه الإخطارات إلى التغييرات الرئيسية التي تطرأ على حسابات Google للمستخدمين ، والتي يمكن أن يكون لها أيضًا آثار أمنية على حساباتهم مع تطبيقك. على سبيل المثال ، إذا تم الاستيلاء على حساب Google لأحد المستخدمين ، فقد يؤدي ذلك إلى اختراق حساب المستخدم مع تطبيقك من خلال استرداد حساب البريد الإلكتروني أو استخدام تسجيل الدخول الأحادي.

لمساعدتك في التخفيف من المخاطر المحتملة لمثل هذه الأحداث ، ترسل Google كائنات الخدمة الخاصة بك والتي تسمى الرموز المميزة لحدث الأمان. تكشف هذه الرموز المميزة القليل جدًا من المعلومات - فقط نوع حدث الأمان ووقت حدوثه ومعرف المستخدم المتأثر - ولكن يمكنك استخدامها لاتخاذ الإجراء المناسب استجابةً لذلك. على سبيل المثال ، إذا تم اختراق حساب Google للمستخدم ، فيمكنك تعطيل تسجيل الدخول إلى Google مؤقتًا لهذا المستخدم ومنع إرسال رسائل البريد الإلكتروني لاسترداد الحساب إلى عنوان Gmail الخاص بالمستخدم.

تعتمد الحماية عبر الحساب على معيار RISC ، الذي تم تطويره في مؤسسة OpenID.

ملخص

لاستخدام Cross-Account Protection مع تطبيقك أو خدمتك ، يجب عليك إكمال المهام التالية:

  1. قم بإعداد مشروعك في API Console.

  2. أنشئ نقطة نهاية لمستلم الحدث ، والتي سترسل إليها Google الرموز المميزة لحدث الأمان. تعتبر نقطة النهاية هذه مسؤولة عن التحقق من صحة الرموز المميزة التي تتلقاها ثم الاستجابة لأحداث الأمان بأي طريقة تختارها.

  3. سجّل نقطة النهاية مع Google لبدء تلقي الرموز المميزة لحدث الأمان.

المتطلبات المسبقة

لا تتلقى سوى الرموز المميزة لحدث الأمان لمستخدمي Google الذين منحوا إذن الخدمة للوصول إلى معلومات ملفاتهم الشخصية أو عناوين البريد الإلكتروني الخاصة بهم. تحصل على هذا الإذن عن طريق طلب profile أو نطاقات email . تطلب حزم SDK لتسجيل الدخول إلى Google هذه النطاقات افتراضيًا ، ولكن إذا لم تستخدم الإعدادات الافتراضية ، أو إذا كنت تصل إلى نقطة نهاية OpenID Connect الخاصة بـ Google مباشرةً ، فتأكد من أنك تطلب واحدًا على الأقل من هذه النطاقات.

قم بإعداد مشروع في API Console

قبل أن تتمكن من بدء تلقي الرموز المميزة لحدث الأمان ، يجب عليك إنشاء حساب خدمة وتمكين RISC API في مشروع API Console الخاص بك. يجب عليك استخدام نفس مشروع API Console الذي تستخدمه للوصول إلى خدمات Google ، مثل تسجيل الدخول بحساب Google ، في تطبيقك.

لإنشاء حساب الخدمة:

  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 في نشر سلاسل موقعة مشفرة تسمى رموز حدث الأمان إلى نقطة النهاية. الرموز المميزة لحدث الأمان هي JWTs الموقعة التي تحتوي على معلومات حول حدث واحد متعلق بالأمان.

لكل رمز مميز لحدث الأمان تتلقاه عند نقطة النهاية ، تحقق أولاً من الرمز المميز وفك تشفيره ، ثم تعامل مع حدث الأمان على النحو المناسب لخدمتك. تصف الأقسام التالية هذه المهام:

1. فك شفرة حدث الأمان والتحقق منه

نظرًا لأن الرموز المميزة لحدث الأمان هي نوع معين من JWT ، يمكنك استخدام أي مكتبة JWT ، مثل تلك المدرجة في jwt.io ، لفك تشفيرها والتحقق من صحتها. أيًا كانت المكتبة التي تستخدمها ، يجب أن يقوم رمز التحقق من صحة الرمز الخاص بك بما يلي:

  1. احصل على معرّف مصدر الحماية عبر الحساب ( issuer ) وتوقيع شهادة مفتاح URI ( jwks_uri ) من مستند تكوين RISC من Google ، والذي يمكنك العثور عليه على 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;
}

بايثون

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 تشير مزاعم المصدر من رمز (جوجل) وورمزية تهدف المتلقي (الخدمة). لقد تحققت من هذه المطالبات في الخطوة السابقة.

مطالبة jti هي سلسلة تحدد حدث أمان واحد ، وهي فريدة من نوعها لمجموعة البث. يمكنك استخدام هذا المعرف لتتبع الأحداث الأمنية التي تلقيتها.

تحتوي مطالبة events على معلومات حول حدث الأمان الذي يمثله الرمز المميز. هذا الادعاء عبارة عن تعيين من معرف نوع الحدث إلى مطالبة subject ، والتي تحدد المستخدم الذي يهتم به هذا الحدث ، وأي تفاصيل إضافية حول الحدث الذي قد يكون متاحًا.

تحدد مطالبة subject مستخدمًا معينًا بمعرف حساب Google الفريد ( sub ). هذا المعرف هو نفسه المعرف المضمن في الرموز المميزة للمعرف التي ينتجها تسجيل الدخول بحساب Google . عندما يكون subject_type المطالبة هو id_token_claims ، فقد يتضمن أيضًا حقل email مع عنوان البريد الإلكتروني للمستخدم.

استخدم المعلومات الواردة في مطالبة events لاتخاذ الإجراء المناسب لنوع الحدث على حساب المستخدم المحدد.

أنواع الأحداث المدعومة

تدعم Cross-Account Protection الأنواع التالية من أحداث الأمان:

نوع الحدث صفات كيف تجاوب
https://schemas.openid.net/secevent/risc/event-type/sessions-revoked مطلوب : أعد تأمين حساب المستخدم من خلال إنهاء جلساته المفتوحة حاليًا.
https://schemas.openid.net/secevent/oauth/event-type/tokens-revoked

مطلوب : إذا كان الرمز المميز لتسجيل الدخول بحساب Google ، فقم بإنهاء الجلسات المفتوحة حاليًا. بالإضافة إلى ذلك ، قد ترغب في أن تقترح على المستخدم إعداد طريقة تسجيل دخول بديلة.

مقترح : إذا كان الرمز المميز للوصول إلى Google APIs الأخرى ، فاحذف أيًا من رموز OAuth المميزة التي قمت بتخزينها.

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

مطلوب : إذا كان سبب تعطيل الحساب هو hijacking ، 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 مقترح : سجّل استلام رمز اختبار مميز.

الأحداث المكررة والفائتة

ستحاول Cross-Account Protection إعادة تسليم الأحداث التي تعتقد أنه لم يتم تسليمها. لذلك ، قد تتلقى أحيانًا نفس الحدث عدة مرات. إذا كان هذا قد يتسبب في إجراءات متكررة تزعج المستخدمين لديك ، ففكر في استخدام مطالبة jti (وهي معرّف فريد لحدث ما) للتخلص من الأحداث. هناك أدوات خارجية مثل Google Cloud Dataflow التي قد تساعدك على تنفيذ عملية إلغاء تدفق البيانات.

لاحظ أنه يتم تسليم الأحداث مع عمليات إعادة محاولات محدودة ، لذا إذا تعطل جهاز الاستقبال الخاص بك لفترة طويلة من الوقت ، فقد تفوتك بعض الأحداث بشكل دائم.

سجل جهاز الاستقبال الخاص بك

لبدء تلقي أحداث الأمان ، قم بتسجيل نقطة نهاية جهاز الاستقبال الخاص بك باستخدام RISC API. يجب أن تكون المكالمات إلى RISC API مصحوبة برمز ترخيص مميز.

ستتلقى أحداث الأمان لمستخدمي تطبيقك فقط ، لذا يلزمك تهيئة شاشة موافقة OAuth في مشروع GCP الخاص بك كشرط أساسي للخطوات الموضحة أدناه.

1. إنشاء رمز مميز للترخيص

لإنشاء رمز ترخيص مميز لواجهة برمجة تطبيقات RISC ، أنشئ 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;
}

بايثون

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. قم باستدعاء واجهة برمجة تطبيقات تكوين دفق 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);

بايثون

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" } إلى نفس نقطة النهاية.

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

بايثون

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 يجب أن يحتوي تكوين الدفق على حقل اسم الحقل $ . طلبك إلى نقطة نهاية https://risc.googleapis.com/v1beta/stream:update غير صالح أو لا يمكن تحليله. الرجاء تضمين $ fieldname في طلبك.
401 غير مصرح. فشل التفويض. تأكد من إرفاق رمز ترخيص مميز بالطلب وأن الرمز المميز صالح ولم تنته صلاحيته.
403 يجب أن تكون نقطة نهاية التسليم عنوان HTTPS URL. يجب أن تكون نقطة نهاية التسليم (أي نقطة النهاية التي تتوقع تسليم أحداث RISC إليها) هي HTTPS. نحن لا نرسل أحداث RISC إلى عناوين HTTP URL.
403 لا يحتوي تكوين الدفق الحالي على طريقة تسليم متوافقة مع المواصفات لـ RISC. يجب أن يحتوي مشروع Google Cloud بالفعل على تكوين RISC. إذا كنت تستخدم Firebase وتم تمكين تسجيل الدخول إلى Google ، فسيقوم Firebase بإدارة RISC لمشروعك ؛ لن تتمكن من إنشاء تكوين مخصص. إذا كنت لا تستخدم تسجيل الدخول بحساب Google لمشروع Firebase الخاص بك ، فالرجاء تعطيله ، ثم محاولة التحديث مرة أخرى بعد ساعة.
403 لا يمكن العثور على المشروع. تأكد من أنك تستخدم حساب الخدمة الصحيح للمشروع الصحيح. ربما تستخدم حساب خدمة مرتبطًا بمشروع محذوف. تعرف على كيفية الاطلاع على جميع حسابات الخدمة المرتبطة بالمشروع .
403 يجب أن يكون لحساب الخدمة أذونات محرر في مشروعك. انتقل إلى وحدة تحكم Google Cloud Platform الخاصة بمشروعك وامنح حساب الخدمة الذي يُجري محرر المكالمات / إذن المالك لمشروعك من خلال اتباع هذه التعليمات .
403 يجب استدعاء واجهات برمجة تطبيقات إدارة الدفق بواسطة حساب خدمة فقط. فيما يلي مزيد من المعلومات حول كيفية استدعاء Google APIs باستخدام حساب خدمة .
403 لا تنتمي نقطة نهاية التسليم إلى أي من مجالات مشروعك. يحتوي كل مشروع على مجموعة من المجالات المصرح بها. إذا كانت نقطة نهاية التسليم (أي نقطة النهاية التي تتوقع تسليم أحداث RISC إليها) غير مستضافة على أحدها ، فنحن نطلب منك إضافة نطاق نقطة النهاية إلى تلك المجموعة.
403 لاستخدام واجهة برمجة التطبيقات هذه ، يجب أن يحتوي مشروعك على عميل OAuth واحد على الأقل مهيأ. لا يعمل RISC إلا إذا قمت بإنشاء تطبيق يدعم تسجيل الدخول إلى Google . يتطلب هذا الاتصال عميل OAuth. إذا كان مشروعك لا يحتوي على عملاء OAuth ، فمن المحتمل ألا يكون RISC مفيدًا لك. تعرف على المزيد حول استخدام Google لـ OAuth لواجهات برمجة التطبيقات الخاصة بنا .
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 .