'सभी खातों की सुरक्षा' सुविधा की मदद से उपयोगकर्ता खातों को सुरक्षित रखना

अगर आपका ऐप्लिकेशन, उपयोगकर्ताओं को Google का इस्तेमाल करके अपने खातों में साइन इन करने की अनुमति देता है, तो क्रॉस-खाता सुरक्षा सेवा से मिलने वाली सुरक्षा से जुड़ी इवेंट की सूचनाओं को सुनकर और उनका जवाब देकर, शेयर किए गए इन उपयोगकर्ताओं के खातों की सुरक्षा को बेहतर बनाया जा सकता है.

इन सूचनाओं से, आपको अपने उपयोगकर्ताओं के Google खातों में होने वाले बड़े बदलावों के बारे में पता चलता है. इन बदलावों से, अक्सर आपके ऐप्लिकेशन में मौजूद उपयोगकर्ताओं के खातों की सुरक्षा पर भी असर पड़ सकता है. उदाहरण के लिए, अगर किसी उपयोगकर्ता का Google खाता हाइजैक कर लिया गया है, तो हो सकता है कि ईमेल खाता वापस पाने या सिंगल साइन-ऑन की सुविधा का इस्तेमाल करके, आपके ऐप्लिकेशन में मौजूद उपयोगकर्ता के खाते को हैक कर लिया जाए.

इस तरह की घटनाओं के जोखिम को कम करने में आपकी मदद करने के लिए, Google आपकी सेवा के लिए ऑब्जेक्ट भेजता है. इन्हें सुरक्षा इवेंट टोकन कहा जाता है. इन टोकन में बहुत कम जानकारी होती है. जैसे, सुरक्षा से जुड़ी घटना का टाइप और वह कब हुई, और उससे जिस उपयोगकर्ता को असर पड़ा है उसका आइडेंटिफ़ायर. हालांकि, इनका इस्तेमाल करके, ज़रूरी कार्रवाई की जा सकती है. उदाहरण के लिए, अगर किसी उपयोगकर्ता के Google खाते के साथ छेड़छाड़ की गई है, तो उस उपयोगकर्ता के लिए'Google से साइन इन करें' सुविधा को कुछ समय के लिए बंद किया जा सकता है. साथ ही, खाता वापस पाने के ईमेल को उपयोगकर्ता के Gmail पते पर भेजने से रोका जा सकता है.

क्रॉस-खाता सुरक्षा की सुविधा, आरआईएससी स्टैंडर्ड पर आधारित है. इसे OpenID Foundation ने डेवलप किया है.

खास जानकारी

अपने ऐप्लिकेशन या सेवा के साथ 'सभी खातों की सुरक्षा' सुविधा का इस्तेमाल करने के लिए, आपको ये काम पूरे करने होंगे:

  1. में अपना प्रोजेक्ट सेट अप करें.

  2. इवेंट रिसीवर एंडपॉइंट बनाएं, जिस पर Google सुरक्षा से जुड़े इवेंट के टोकन भेजेगा. यह एंडपॉइंट, मिलने वाले टोकन की पुष्टि करने के लिए ज़िम्मेदार होता है. इसके बाद, यह आपके चुने गए तरीके से सुरक्षा इवेंट का जवाब देता है.

  3. सुरक्षा से जुड़े इवेंट के टोकन पाने के लिए, अपने एंडपॉइंट को Google के साथ रजिस्टर करें.

पूर्वापेक्षा

आपको सिर्फ़ उन Google उपयोगकर्ताओं के लिए सुरक्षा इवेंट टोकन मिलते हैं जिन्होंने आपकी सेवा को अपनी प्रोफ़ाइल की जानकारी या ईमेल पते ऐक्सेस करने की अनुमति दी है. profile या email स्कोप का अनुरोध करके, आपको यह अनुमति मिलती है. नए Google से साइन इन करें या लेगसी Google साइन-इन SDK टूल, डिफ़ॉल्ट रूप से इन स्कोप का अनुरोध करते हैं. हालांकि, अगर डिफ़ॉल्ट सेटिंग का इस्तेमाल नहीं किया जाता है या Google के OpenID Connect एंडपॉइंट को सीधे तौर पर ऐक्सेस किया जाता है, तो पक्का करें कि आपने इनमें से कम से कम एक स्कोप का अनुरोध किया हो.

में प्रोजेक्ट सेट अप करना

सुरक्षा से जुड़े इवेंट के टोकन पाने से पहले, आपको एक सेवा खाता बनाना होगा और अपने प्रोजेक्ट में RISC API को चालू करना होगा. आपको उसी प्रोजेक्ट का इस्तेमाल करना होगा जिसका इस्तेमाल आपने अपने ऐप्लिकेशन में Google की सेवाओं, जैसे कि Google Sign-in को ऐक्सेस करने के लिए किया है.

सेवा खाता बनाने के लिए:

  1. खोलें. जब आपसे कहा जाए, तब वहप्रोजेक्ट चुनें जिसका इस्तेमाल करके, अपने ऐप्लिकेशन में Google की सेवाओं को ऐक्सेस किया जाता है.

  2. क्रेडेंशियल बनाएं > सेवा खाता पर क्लिक करें.

  3. इन निर्देशों का पालन करके, RISC कॉन्फ़िगरेशन एडमिन की भूमिका (roles/riscconfigs.admin) वाला नया सेवा खाता बनाएं.

  4. अपने नए बनाए गए सेवा खाते के लिए एक कुंजी बनाएं. JSON पासकोड का टाइप चुनें. इसके बाद, बनाएं पर क्लिक करें. कुंजी बन जाने के बाद, आपको एक JSON फ़ाइल डाउनलोड करनी होगी. इसमें आपके सेवा खाते के क्रेडेंशियल शामिल होंगे. इस फ़ाइल को किसी सुरक्षित जगह पर रखें, लेकिन यह आपके इवेंट रिसीवर एंडपॉइंट के लिए ऐक्सेस की जा सके.

अपने प्रोजेक्ट के क्रेडेंशियल पेज पर, उन क्लाइंट आईडी का भी ध्यान रखें जिनका इस्तेमाल'Google से साइन इन करें' या Google साइन-इन (लेगसी) के लिए किया जाता है. आम तौर पर, आपके पास हर उस प्लैटफ़ॉर्म के लिए एक क्लाइंट आईडी होता है जिस पर आपका ऐप्लिकेशन काम करता है. अगले सेक्शन में बताया गया है कि सुरक्षा इवेंट के टोकन की पुष्टि करने के लिए, आपको इन क्लाइंट आईडी की ज़रूरत होगी.

RISC API को चालू करने के लिए:

  1. में, RISC API पेज खोलें. पक्का करें कि Google की सेवाओं को ऐक्सेस करने के लिए इस्तेमाल किया जाने वाला प्रोजेक्ट अब भी चुना गया हो.

  2. आरआईएससी की शर्तें पढ़ें और पक्का करें कि आपने ज़रूरी शर्तों को समझ लिया हो.

    अगर किसी ऐसे प्रोजेक्ट के लिए एपीआई चालू किया जा रहा है जिस पर किसी संगठन का मालिकाना हक है, तो पक्का करें कि आपके पास अपने संगठन को आरआईएससी की शर्तों से बांधने का अधिकार हो.

  3. चालू करें पर सिर्फ़ तब क्लिक करें, जब आपने आरआईएससी की शर्तों को स्वीकार कर लिया हो.

इवेंट रिसीवर एंडपॉइंट बनाना

Google से सुरक्षा से जुड़े इवेंट की सूचनाएं पाने के लिए, आपको एचटीटीपीएस पोस्ट अनुरोधों को मैनेज करने वाला एचटीटीपीएस एंडपॉइंट बनाना होगा. इस एंडपॉइंट को रजिस्टर करने के बाद (नीचे देखें), Google एंडपॉइंट पर, क्रिप्टोग्राफ़िक तरीके से हस्ताक्षर की गई स्ट्रिंग पोस्ट करना शुरू कर देगा. इन्हें सुरक्षा इवेंट टोकन कहा जाता है. सुरक्षा से जुड़े इवेंट के टोकन, हस्ताक्षर किए गए JWT होते हैं. इनमें, सुरक्षा से जुड़े किसी एक इवेंट की जानकारी होती है.

अपने एंडपॉइंट पर मिलने वाले हर सुरक्षा इवेंट टोकन के लिए, पहले टोकन की पुष्टि करें और उसे डिकोड करें. इसके बाद, अपनी सेवा के हिसाब से सुरक्षा इवेंट को मैनेज करें. डिकोड करने से पहले, इवेंट टोकन की पुष्टि करना ज़रूरी है. इससे, नुकसान पहुंचाने वाले लोगों या ग्रुप के नुकसान पहुंचाने वाले हमलों से बचा जा सकता है. इन सेक्शन में इन टास्क के बारे में बताया गया है:

1. सुरक्षा इवेंट टोकन को डिकोड करना और उसकी पुष्टि करना

सुरक्षा इवेंट टोकन, एक खास तरह के JWT होते हैं. इसलिए, इन्हें डिकोड करने और पुष्टि करने के लिए, jwt.io पर दी गई किसी भी JWT लाइब्रेरी का इस्तेमाल किया जा सकता है. किसी भी लाइब्रेरी का इस्तेमाल करने पर, टोकन की पुष्टि करने वाले कोड को ये काम करने होंगे:

  1. Google के आरआईएससी कॉन्फ़िगरेशन दस्तावेज़ से, क्रॉस-खाता सुरक्षा जारी करने वाले आइडेंटिफ़ायर (issuer) और हस्ताक्षर करने की कुंजी का सर्टिफ़िकेट यूआरआई (jwks_uri) पाएं. यह दस्तावेज़ https://accounts.google.com/.well-known/risc-configuration पर उपलब्ध है.
  2. अपनी पसंद की JWT लाइब्रेरी का इस्तेमाल करके, सुरक्षा इवेंट टोकन के हेडर से साइनिंग पासकोड आईडी पाएं.
  3. Google के साइनिंग पासकोड के सर्टिफ़िकेट वाले दस्तावेज़ से, उस पासकोड का इस्तेमाल करके सार्वजनिक पासकोड पाएं जो आपको पिछले चरण में मिला था. अगर दस्तावेज़ में आपके ज़रूरत के आईडी वाली कोई कुंजी नहीं है, तो हो सकता है कि सुरक्षा इवेंट टोकन अमान्य हो. साथ ही, आपके एंडपॉइंट को एचटीटीपी गड़बड़ी 400 दिखाना चाहिए.
  4. अपनी पसंद की JWT लाइब्रेरी का इस्तेमाल करके, इनकी पुष्टि करें:
    • सुरक्षा इवेंट टोकन पर, पिछले चरण में मिली सार्वजनिक कुंजी का इस्तेमाल करके हस्ताक्षर किया जाता है.
    • टोकन का aud दावा, आपके ऐप्लिकेशन का एक क्लाइंट आईडी है.
    • टोकन का iss दावा, जारी करने वाले आइडेंटिफ़ायर से मेल खाता है. यह आइडेंटिफ़ायर, आरआईएससी के डिस्कवरी दस्तावेज़ से मिला है. ध्यान दें कि आपको टोकन की समयसीमा खत्म होने (exp) की पुष्टि करने की ज़रूरत नहीं है, क्योंकि सुरक्षा इवेंट टोकन, पुराने इवेंट दिखाते हैं. इसलिए, इनकी समयसीमा खत्म नहीं होती.

उदाहरण के लिए:

Java

java-jwt और jwks-rsa-java का इस्तेमाल करके:

public DecodedJWT validateSecurityEventToken(String token) {
    DecodedJWT jwt = null;
    try {
        // In a real implementation, get these values from
        // https://accounts.google.com/.well-known/risc-configuration
        String issuer = "accounts.google.com";
        String jwksUri = "https://www.googleapis.com/oauth2/v3/certs";

        // Get the ID of the key used to sign the token.
        DecodedJWT unverifiedJwt = JWT.decode(token);
        String keyId = unverifiedJwt.getKeyId();

        // Get the public key from Google.
        JwkProvider googleCerts = new UrlJwkProvider(new URL(jwksUri), null, null);
        PublicKey publicKey = googleCerts.get(keyId).getPublicKey();

        // Verify and decode the token.
        Algorithm rsa = Algorithm.RSA256((RSAPublicKey) publicKey, null);
        JWTVerifier verifier = JWT.require(rsa)
                .withIssuer(issuer)
                // Get your apps' client IDs from the API console:
                // ?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:
# ?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)

अगर टोकन मान्य है और उसे डिकोड किया जा चुका है, तो एचटीटीपी स्टेटस 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 खाता आईडी, 'Google से साइन इन करें' (Javascript, HTML) लाइब्रेरी, लेगसी Google साइन-इन लाइब्रेरी या OpenID Connect से जारी किए गए JWT आईडी टोकन में मौजूद आइडेंटिफ़ायर (sub) से मेल खाता है. जब दावे का subject_type id_token_claims हो, तो उसमें उपयोगकर्ता के ईमेल पते के साथ email फ़ील्ड भी शामिल हो सकता है.

events दावे में दी गई जानकारी का इस्तेमाल करके, किसी उपयोगकर्ता के खाते पर हुई गतिविधि के टाइप के हिसाब से सही कार्रवाई करें.

OAuth टोकन आइडेंटिफ़ायर

अलग-अलग टोकन के बारे में OAuth इवेंट के लिए, टोकन के विषय आइडेंटिफ़ायर टाइप में ये फ़ील्ड शामिल होते हैं:

  • token_type: सिर्फ़ refresh_token का इस्तेमाल किया जा सकता है.

  • token_identifier_alg: संभावित वैल्यू के लिए, नीचे दी गई टेबल देखें.

  • token: नीचे दी गई टेबल देखें.

token_identifier_alg टोकन
prefix टोकन के पहले 16 वर्ण.
hash_base64_sha512_sha512 SHA-512 का इस्तेमाल करके, टोकन का डबल हैश.

अगर इन इवेंट के साथ इंटिग्रेट किया जाता है, तो हमारा सुझाव है कि इन संभावित वैल्यू के आधार पर अपने टोकन को इंडेक्स करें, ताकि इवेंट मिलने पर तुरंत मैच हो सके.

इस्तेमाल किए जा सकने वाले इवेंट टाइप

'सभी खातों की सुरक्षा' सुविधा, सुरक्षा से जुड़े इन इवेंट के साथ काम करती है:

इवेंट का टाइप एट्रिब्यूट जवाब देने का तरीका
https://schemas.openid.net/secevent/risc/event-type/sessions-revoked ज़रूरी है: उपयोगकर्ता के मौजूदा सेशन को बंद करके, उसके खाते को फिर से सुरक्षित करें.
https://schemas.openid.net/secevent/oauth/event-type/tokens-revoked

ज़रूरी है: अगर टोकन, Google साइन इन के लिए है, तो उनके मौजूदा सेशन को बंद करें. इसके अलावा, आपके पास उपयोगकर्ता को साइन इन करने का कोई दूसरा तरीका सेट अप करने का सुझाव देने का विकल्प भी है.

सुझाव: अगर टोकन, Google के अन्य एपीआई को ऐक्सेस करने के लिए है, तो उपयोगकर्ता के उन सभी OAuth टोकन को मिटाएं जिन्हें आपने सेव किया है.

https://schemas.openid.net/secevent/oauth/event-type/token-revoked टोकन आइडेंटिफ़ायर के लिए, OAuth टोकन आइडेंटिफ़ायर सेक्शन देखें

ज़रूरी है: अगर आपने उससे जुड़ा रीफ़्रेश टोकन सेव किया है, तो उसे मिटाएं और अगली बार ऐक्सेस टोकन की ज़रूरत पड़ने पर, उपयोगकर्ता से फिर से सहमति देने का अनुरोध करें.

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

ज़रूरी है: अगर खाता 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-credential-change-required सुझाव: अपनी सेवा पर संदिग्ध गतिविधि की जांच करें और ज़रूरी कार्रवाई करें.
https://schemas.openid.net/secevent/risc/event-type/verification state=state सुझाया गया: लॉग करें कि आपको टेस्ट टोकन मिला है.

डुप्लीकेट और छूटे हुए इवेंट

क्रॉस-खाता सुरक्षा, उन इवेंट को फिर से डिलीवर करने की कोशिश करेगी जिनके डिलीवर न होने का अनुमान है. इसलिए, कभी-कभी आपको एक ही इवेंट कई बार मिल सकता है. अगर इससे बार-बार ऐसी कार्रवाइयां हो सकती हैं जिनसे आपके उपयोगकर्ताओं को परेशानी हो सकती है, तो इवेंट को डुप्लीकेट होने से बचाने के लिए, jti दावे (जो किसी इवेंट के लिए यूनीक आइडेंटिफ़ायर होता है) का इस्तेमाल करें. Google Cloud Dataflow जैसे एक्सटर्नल टूल की मदद से, डुप्लीकेट डेटा हटाने वाले डेटाफ़्लो को लागू किया जा सकता है.

ध्यान दें कि इवेंट को सीमित बार फिर से भेजा जाता है. इसलिए, अगर आपका रिसीवर लंबे समय तक काम नहीं कर रहा है, तो हो सकता है कि आपको कुछ इवेंट हमेशा के लिए न मिलें.

ईमेल पाने वाले व्यक्ति को रजिस्टर करना

सुरक्षा से जुड़े इवेंट पाने के लिए, RISC API का इस्तेमाल करके अपना रिसीवर एंडपॉइंट रजिस्टर करें. RISC API को कॉल करने के लिए, अनुमति वाला टोकन होना ज़रूरी है.

आपको सिर्फ़ अपने ऐप्लिकेशन के उपयोगकर्ताओं के लिए सुरक्षा इवेंट मिलेंगे. इसलिए, नीचे दिए गए चरणों को पूरा करने के लिए, आपको अपने GCP प्रोजेक्ट में OAuth की सहमति वाली स्क्रीन को कॉन्फ़िगर करना होगा.

1. अनुमति वाला टोकन जनरेट करना

RISC API के लिए अनुमति वाला टोकन जनरेट करने के लिए, इन दावों के साथ एक JWT बनाएं:

{
  "iss": SERVICE_ACCOUNT_EMAIL,
  "sub": SERVICE_ACCOUNT_EMAIL,
  "aud": "https://risc.googleapis.com/google.identity.risc.v1beta.RiscManagementService",
  "iat": CURRENT_TIME,
  "exp": CURRENT_TIME + 3600
}

अपने सेवा खाते की निजी कुंजी का इस्तेमाल करके, JWT पर हस्ताक्षर करें. यह कुंजी, सेवा खाते की कुंजी बनाते समय डाउनलोड की गई JSON फ़ाइल में मिल सकती है.

उदाहरण के लिए:

Java

java-jwt और Google की पुष्टि करने वाली लाइब्रेरी का इस्तेमाल करके:

public static String makeBearerToken() {
    String token = null;
    try {
        // Get signing key and client email address.
        FileInputStream is = new FileInputStream("your-service-account-credentials.json");
        ServiceAccountCredentials credentials =
               (ServiceAccountCredentials) GoogleCredentials.fromStream(is);
        PrivateKey privateKey = credentials.getPrivateKey();
        String keyId = credentials.getPrivateKeyId();
        String clientEmail = credentials.getClientEmail();

        // Token must expire in exactly one hour.
        Date issuedAt = new Date();
        Date expiresAt = new Date(issuedAt.getTime() + 3600000);

        // Create signed token.
        Algorithm rsaKey = Algorithm.RSA256(null, (RSAPrivateKey) privateKey);
        token = JWT.create()
                .withIssuer(clientEmail)
                .withSubject(clientEmail)
                .withAudience("https://risc.googleapis.com/google.identity.risc.v1beta.RiscManagementService")
                .withIssuedAt(issuedAt)
                .withExpiresAt(expiresAt)
                .withKeyId(keyId)
                .sign(rsaKey);
    } catch (ClassCastException e) {
        // Credentials file doesn't contain a service account key.
    } catch (IOException e) {
        // Credentials file couldn't be loaded.
    }
    return token;
}

Python

import json
import time

import jwt  # pip install pyjwt

def make_bearer_token(credentials_file):
    with open(credentials_file) as service_json:
        service_account = json.load(service_json)
        issuer = service_account['client_email']
        subject = service_account['client_email']
        private_key_id = service_account['private_key_id']
        private_key = service_account['private_key']
    issued_at = int(time.time())
    expires_at = issued_at + 3600
    payload = {'iss': issuer,
               'sub': subject,
               'aud': 'https://risc.googleapis.com/google.identity.risc.v1beta.RiscManagementService',
               'iat': issued_at,
               'exp': expires_at}
    encoded = jwt.encode(payload, private_key, algorithm='RS256',
                         headers={'kid': private_key_id})
    return encoded

auth_token = make_bearer_token('your-service-account-credentials.json')

इस ऑथराइज़ेशन टोकन का इस्तेमाल, एक घंटे के लिए RISC API कॉल करने के लिए किया जा सकता है. टोकन की समयसीमा खत्म होने पर, RISC API कॉल जारी रखने के लिए नया टोकन जनरेट करें.

2. RISC स्ट्रीम कॉन्फ़िगरेशन एपीआई को कॉल करना

अब आपके पास अनुमति वाला टोकन है. इसलिए, अपने प्रोजेक्ट की सुरक्षा इवेंट स्ट्रीम को कॉन्फ़िगर करने के लिए, RISC API का इस्तेमाल किया जा सकता है. इसमें, अपने रिसीवर एंडपॉइंट को रजिस्टर करना भी शामिल है.

ऐसा करने के लिए, https://risc.googleapis.com/v1beta/stream:update पर एचटीटीपीएस पोस्ट अनुरोध करें. इसमें, अपने रिसीवर एंडपॉइंट और उन सुरक्षा इवेंट के टाइप की जानकारी दें जिनमें आपकी दिलचस्पी है:

POST /v1beta/stream:update HTTP/1.1
Host: risc.googleapis.com
Authorization: Bearer AUTH_TOKEN

{
  "delivery": {
    "delivery_method":
      "https://schemas.openid.net/secevent/risc/delivery-method/push",
    "url": RECEIVER_ENDPOINT
  },
  "events_requested": [
    SECURITY_EVENT_TYPES
  ]
}

उदाहरण के लिए:

Java

public static void configureEventStream(final String receiverEndpoint,
                                        final List<String> eventsRequested,
                                        String authToken) throws IOException {
    ObjectMapper jsonMapper = new ObjectMapper();
    String streamConfig = jsonMapper.writeValueAsString(new Object() {
        public Object delivery = new Object() {
            public String delivery_method =
                    "https://schemas.openid.net/secevent/risc/delivery-method/push";
            public String url = receiverEndpoint;
        };
        public List<String> events_requested = eventsRequested;
    });

    HttpPost updateRequest = new HttpPost("https://risc.googleapis.com/v1beta/stream:update");
    updateRequest.addHeader("Content-Type", "application/json");
    updateRequest.addHeader("Authorization", "Bearer " + authToken);
    updateRequest.setEntity(new StringEntity(streamConfig));

    HttpResponse updateResponse = new DefaultHttpClient().execute(updateRequest);
    Header[] responseContentTypeHeaders = updateResponse.getHeaders("Content-Type");
    StatusLine responseStatus = updateResponse.getStatusLine();
    int statusCode = responseStatus.getStatusCode();
    HttpEntity entity = updateResponse.getEntity();
    // Now handle response
}

// ...

configureEventStream(
        "https://your-service.example.com/security-event-receiver",
        Arrays.asList(
                "https://schemas.openid.net/secevent/risc/event-type/account-credential-change-required",
                "https://schemas.openid.net/secevent/risc/event-type/account-disabled"),
        authToken);

Python

import requests

def configure_event_stream(auth_token, receiver_endpoint, events_requested):
    stream_update_endpoint = 'https://risc.googleapis.com/v1beta/stream:update'
    headers = {'Authorization': 'Bearer {}'.format(auth_token)}
    stream_cfg = {'delivery': {'delivery_method': 'https://schemas.openid.net/secevent/risc/delivery-method/push',
                               'url': receiver_endpoint},
                  'events_requested': events_requested}
    response = requests.post(stream_update_endpoint, json=stream_cfg, headers=headers)
    response.raise_for_status()  # Raise exception for unsuccessful requests

configure_event_stream(auth_token, 'https://your-service.example.com/security-event-receiver',
                       ['https://schemas.openid.net/secevent/risc/event-type/account-credential-change-required',
                        'https://schemas.openid.net/secevent/risc/event-type/account-disabled'])

अगर अनुरोध से एचटीटीपी 200 कोड मिलता है, तो इसका मतलब है कि इवेंट स्ट्रीम को कॉन्फ़िगर कर दिया गया है और आपके रिसीवर एंडपॉइंट को सुरक्षा इवेंट टोकन मिलने शुरू हो जाएंगे. अगले सेक्शन में बताया गया है कि स्ट्रीम कॉन्फ़िगरेशन और एंडपॉइंट की जांच कैसे की जा सकती है, ताकि यह पक्का किया जा सके कि सब कुछ सही तरीके से काम कर रहा है.

स्ट्रीम का मौजूदा कॉन्फ़िगरेशन पाना और उसे अपडेट करना

अगर आपको आने वाले समय में, स्ट्रीम कॉन्फ़िगरेशन में बदलाव करना है, तो ऐसा किया जा सकता है. इसके लिए, https://risc.googleapis.com/v1beta/stream से अनुमति लेकर GET अनुरोध करें. इससे आपको स्ट्रीम का मौजूदा कॉन्फ़िगरेशन मिलेगा. इसके बाद, रिस्पॉन्स बॉडी में बदलाव करें और बदले गए कॉन्फ़िगरेशन को https://risc.googleapis.com/v1beta/stream:update पर पोस्ट करें. इसके लिए, ऊपर दिया गया तरीका अपनाएं.

इवेंट स्ट्रीम को रोकना और फिर से शुरू करना

अगर आपको Google से इवेंट स्ट्रीम को कभी भी बंद करना है, तो अनुरोध के मुख्य हिस्से में { "status": "disabled" } के साथ https://risc.googleapis.com/v1beta/stream/status:update को अनुमति वाला POST अनुरोध करें. स्ट्रीम बंद होने पर, Google आपके एंडपॉइंट पर इवेंट नहीं भेजता. साथ ही, सुरक्षा से जुड़े इवेंट होने पर उन्हें बफ़र नहीं करता. इवेंट स्ट्रीम को फिर से चालू करने के लिए, उसी एंडपॉइंट पर { "status": "enabled" } पोस्ट करें.

3. ज़रूरी नहीं: स्ट्रीम के कॉन्फ़िगरेशन की जांच करना

अपनी इवेंट स्ट्रीम के ज़रिए पुष्टि करने वाला टोकन भेजकर, यह पुष्टि की जा सकती है कि आपका स्ट्रीम कॉन्फ़िगरेशन और रिसीवर एंडपॉइंट, एक साथ सही तरीके से काम कर रहे हैं या नहीं. इस टोकन में एक यूनीक स्ट्रिंग हो सकती है. इसका इस्तेमाल करके, यह पुष्टि की जा सकती है कि टोकन आपके एंडपॉइंट पर मिला है या नहीं. इस फ़्लो का इस्तेमाल करने के लिए, रिसीवर को रजिस्टर करते समय, https://schemas.openid.net/secevent/risc/event-type/verification इवेंट टाइप की सदस्यता लें.

पुष्टि करने वाले टोकन का अनुरोध करने के लिए, https://risc.googleapis.com/v1beta/stream:verify पर अनुमति वाला एचटीटीपीएस पोस्ट अनुरोध करें. अनुरोध के मुख्य हिस्से में, पहचान करने वाली कोई स्ट्रिंग डालें:

{
  "state": "ANYTHING"
}

उदाहरण के लिए:

Java

public static void testEventStream(final String stateString,
                                   String authToken) throws IOException {
    ObjectMapper jsonMapper = new ObjectMapper();
    String json = jsonMapper.writeValueAsString(new Object() {
        public String state = stateString;
    });

    HttpPost updateRequest = new HttpPost("https://risc.googleapis.com/v1beta/stream:verify");
    updateRequest.addHeader("Content-Type", "application/json");
    updateRequest.addHeader("Authorization", "Bearer " + authToken);
    updateRequest.setEntity(new StringEntity(json));

    HttpResponse updateResponse = new DefaultHttpClient().execute(updateRequest);
    Header[] responseContentTypeHeaders = updateResponse.getHeaders("Content-Type");
    StatusLine responseStatus = updateResponse.getStatusLine();
    int statusCode = responseStatus.getStatusCode();
    HttpEntity entity = updateResponse.getEntity();
    // Now handle response
}

// ...

testEventStream("Test token requested at " + new Date().toString(), authToken);

Python

import requests
import time

def test_event_stream(auth_token, nonce):
    stream_verify_endpoint = 'https://risc.googleapis.com/v1beta/stream:verify'
    headers = {'Authorization': 'Bearer {}'.format(auth_token)}
    state = {'state': nonce}
    response = requests.post(stream_verify_endpoint, json=state, headers=headers)
    response.raise_for_status()  # Raise exception for unsuccessful requests

test_event_stream(auth_token, 'Test token requested at {}'.format(time.ctime()))

अनुरोध पूरा होने पर, पुष्टि करने वाला टोकन उस एंडपॉइंट पर भेजा जाएगा जिसे आपने रजिस्टर किया है. उदाहरण के लिए, अगर आपका एंडपॉइंट, पुष्टि करने वाले टोकन को सिर्फ़ लॉग करके मैनेज करता है, तो टोकन मिलने की पुष्टि करने के लिए अपने लॉग की जांच की जा सकती है.

गड़बड़ी के कोड का रेफ़रंस

RISC API, ये गड़बड़ियां दिखा सकता है:

गड़बड़ी कोड गड़बड़ी का मैसेज सुझाई गई कार्रवाइयां
400 स्ट्रीम कॉन्फ़िगरेशन में $fieldname फ़ील्ड होना चाहिए. https://risc.googleapis.com/v1beta/stream:update एंडपॉइंट के लिए किया गया आपका अनुरोध अमान्य है या उसे पार्स नहीं किया जा सकता. कृपया अपने अनुरोध में $fieldname शामिल करें.
401 अनधिकृत. प्राधिकरण विफल रहा. पक्का करें कि आपने अनुरोध के साथ अनुमति वाला टोकन अटैच किया हो. साथ ही, यह भी पक्का करें कि टोकन मान्य हो और उसकी समयसीमा खत्म न हुई हो.
403 डिलीवरी एंडपॉइंट, एचटीटीपीएस यूआरएल होना चाहिए. आपका डिलीवरी एंडपॉइंट (जैसे, वह एंडपॉइंट जहां आपको उम्मीद है कि आरआईएससी इवेंट डिलीवर किए जाएंगे) एचटीटीपीएस होना चाहिए. हम एचटीटीपी यूआरएल पर आरआईएससी इवेंट नहीं भेजते.
403 मौजूदा स्ट्रीम कॉन्फ़िगरेशन में, आरआईएससी के लिए स्पेसिफ़िकेशन के मुताबिक डिलीवरी का तरीका नहीं है. आपके Google Cloud प्रोजेक्ट में पहले से ही आरआईएससी कॉन्फ़िगरेशन होना चाहिए. अगर आपने Firebase का इस्तेमाल किया है और आपने Google साइन इन की सुविधा चालू की है, तो Firebase आपके प्रोजेक्ट के लिए आरआईएससी को मैनेज करेगा. साथ ही, आपके पास कस्टम कॉन्फ़िगरेशन बनाने का विकल्प नहीं होगा. अगर Firebase प्रोजेक्ट के लिए Google साइन इन का इस्तेमाल नहीं किया जा रहा है, तो कृपया इसे बंद करें. इसके बाद, एक घंटे बाद फिर से अपडेट करने की कोशिश करें.
403 प्रोजेक्ट नहीं मिला. पक्का करें कि आपने सही प्रोजेक्ट के लिए सही सेवा खाते का इस्तेमाल किया हो. ऐसा हो सकता है कि मिटाए गए प्रोजेक्ट से जुड़े सेवा खाते का इस्तेमाल किया जा रहा हो. किसी प्रोजेक्ट से जुड़े सभी सेवा खाते देखने का तरीका जानें.
403 सेवा खाते को आपके RISC कॉन्फ़िगरेशन को ऐक्सेस करने की अनुमति चाहिए अपने प्रोजेक्ट पर जाएं और उस सेवा खाते को "आरआईएससी कॉन्फ़िगरेशन एडमिन" की भूमिका (roles/riscconfigs.admin) असाइन करें जो आपके प्रोजेक्ट को कॉल कर रहा है. इसके लिए, इन निर्देशों का पालन करें.
403 स्ट्रीम मैनेजमेंट एपीआई को सिर्फ़ किसी सेवा खाते से कॉल किया जाना चाहिए. सेवा खाते की मदद से, Google के एपीआई को कॉल करने के तरीके के बारे में ज़्यादा जानकारी यहां दी गई है.
403 डिलीवरी एंडपॉइंट, आपके किसी भी प्रोजेक्ट के डोमेन से नहीं जुड़ा है. हर प्रोजेक्ट में, अनुमति वाले डोमेन का एक सेट होता है. अगर आपका डिलीवरी एंडपॉइंट (यानी वह एंडपॉइंट जिस पर आपको उम्मीद है कि आरआईएससी इवेंट डिलीवर किए जाएंगे) उनमें से किसी एक पर होस्ट नहीं किया गया है, तो आपको उस सेट में एंडपॉइंट का डोमेन जोड़ना होगा.
403 इस एपीआई का इस्तेमाल करने के लिए, आपके प्रोजेक्ट में कम से कम एक OAuth क्लाइंट कॉन्फ़िगर होना चाहिए. आरआईएससी सिर्फ़ तब काम करता है, जब आपने ऐसा ऐप्लिकेशन बनाया हो जो Google साइन इन के साथ काम करता हो. इस कनेक्शन के लिए, OAuth क्लाइंट की ज़रूरत होती है. अगर आपके प्रोजेक्ट में कोई OAuth क्लाइंट नहीं है, तो हो सकता है कि आरआईएससी आपके लिए काम का न हो. Google के हमारे एपीआई के लिए, OAuth का इस्तेमाल करने के बारे में ज़्यादा जानें.
403

यह स्थिति काम नहीं करती.

अमान्य स्थिति.

फ़िलहाल, स्ट्रीम के स्टेटस के तौर पर सिर्फ़ “enabled” और “disabled” का इस्तेमाल किया जा सकता है.
404

प्रोजेक्ट में कोई आरआईएससी कॉन्फ़िगरेशन नहीं है.

प्रोजेक्ट में कोई मौजूदा आरआईएससी कॉन्फ़िगरेशन नहीं है. इसलिए, स्टेटस अपडेट नहीं किया जा सकता.

नया स्ट्रीम कॉन्फ़िगरेशन बनाने के लिए, 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 पर पोस्ट करें.