گوگل متعهد به پیشبرد برابری نژادی برای جوامع سیاه پوست است. ببینید چگونه.

با Cross-Account Protection از حسابهای کاربر محافظت کنید

اگر برنامه شما به کاربران اجازه می دهد با استفاده از Google به سیستم حسابهای خود وارد شوند ، می توانید با گوش دادن و پاسخ دادن به اعلان های رویداد امنیتی ارائه شده توسط سرویس Cross-Account ، امنیت این حساب های مشترک کاربران را بهبود بخشید.

این اعلان ها شما را از تغییرات عمده ای در حساب های Google کاربران خود آگاه می کند ، که همچنین ممکن است پیامدهای امنیتی برای حساب های آنها با برنامه شما داشته باشد. به عنوان مثال ، اگر حساب Google کاربر ربوده شود ، این امر به طور بالقوه می تواند منجر به خطر افتادن حساب کاربر با برنامه شما از طریق بازیابی حساب ایمیل یا استفاده از یک ورود به سیستم شود.

برای کمک به شما در کاهش احتمال بروز چنین رویدادهایی ، Google اشیا service خدمات شما را به نام نشانه رویداد امنیتی ارسال می کند. این نشانه ها اطلاعات بسیار کمی را در معرض دید قرار می دهند - فقط نوع رویداد امنیتی و زمان وقوع آن و شناسه کاربر آسیب دیده - اما می توانید از آنها برای اقدامات مناسب در پاسخ استفاده کنید. به عنوان مثال ، اگر حساب Google کاربر به خطر بیفتد ، می توانید ورود به سیستم Google را به طور موقت برای آن کاربر غیرفعال کنید و از ارسال ایمیل های بازیابی حساب به آدرس Gmail کاربر جلوگیری کنید.

Cross-Account Protection براساس استاندارد 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 Sign-in در برنامه خود استفاده می کنید.

برای ایجاد حساب سرویس:

  1. API Console Credentials page را باز کنید. در صورت درخواست ، پروژه API Console را که برای دسترسی به خدمات Google در برنامه خود استفاده می کنید ، انتخاب کنید.

  2. روی ایجاد اعتبارنامه> کلید حساب سرویس کلیک کنید.

  3. با نقش Editor یک حساب سرویس جدید ایجاد کنید.

    نوع کلید 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. شناسه صادرکننده Cross-Account Protection ( issuer ) و URI گواهی کلید ( jwks_uri ) را از سند پیکربندی RISC Google دریافت کنید ، که می توانید در https://accounts.google.com/.well-known/risc-configuration پیدا 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 Sign in است . وقتی 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 است ، جلسات فعلی آنها را خاتمه دهید. بعلاوه ، ممکن است بخواهید به کاربر پیشنهاد دهید یک روش ورود به سیستم جایگزین تنظیم کند.

پیشنهاد شده : اگر رمز برای دسترسی به سایر API های Google است ، هر یک از نشانه های 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 وجود دارد که ممکن است به شما در اجرای جریان داده de-dup کمک کند.

توجه داشته باشید که رویدادها با تلاش مجدد محدود تحویل داده می شوند بنابراین اگر گیرنده شما برای مدت زمان طولانی از کار افتاده باشد ، ممکن است برخی از رویدادها را برای همیشه از دست بدهید.

گیرنده خود را ثبت کنید

برای شروع دریافت رویدادهای امنیتی ، با استفاده از 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 و کتابخانه auth گوگل :

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 stream configuration API تماس بگیرید

اکنون که یک رمز مجوز دارید ، می توانید از RISC API برای پیکربندی جریان رویداد امنیتی پروژه خود ، از جمله ثبت نقطه پایان گیرنده خود استفاده کنید.

برای انجام این کار ، با تعیین نقطه پایانی گیرنده و انواع رویدادهای امنیتی مورد علاقه خود ، به https://risc.googleapis.com/v1beta/stream:update درخواست 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 رویدادها را به نقطه پایانی شما نمی فرستد و هنگام وقوع ، رویدادهای امنیتی را بافر نمی کند. برای فعال کردن مجدد جریان رویداد ، 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);

پایتون

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 Sign in پشتیبانی کند. این اتصال به مشتری 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

کمک خواستن؟

ابتدا بخش مرجع کد خطای ما را بررسی کنید. اگر هنوز سوالی دارید ، آنها را با برچسب #SecEvents روی Stack Overflow قرار دهید .