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

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

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

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

क्रॉस-खाता सुरक्षा, OpenID Foundation में डेवलप किए गए RISC स्टैंडर्ड पर आधारित है.

खास जानकारी

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

  3. अगर आपको RISC की शर्तें स्वीकार हैं, तो ही चालू करें पर क्लिक करें.

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

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

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

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

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

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

अगर टोकन मान्य है और उसे डिकोड कर लिया गया है, तो एचटीटीपी स्टेटस 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 खाता आईडी, Sign In With Google (JavaScript, HTML) लाइब्रेरी, लेगसी Google Sign-in लाइब्रेरी या 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 API को ऐक्सेस करने के लिए किया जाता है, तो उपयोगकर्ता के सेव किए गए किसी भी 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 की auth library का इस्तेमाल करके:

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 पर पोस्ट करें.https://risc.googleapis.com/v1beta/stream:update

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

अगर आपको Google से इवेंट स्ट्रीम को रोकना है, तो https://risc.googleapis.com/v1beta/stream/status:update को एक मान्य POST अनुरोध भेजें. इसके लिए, अनुरोध के मुख्य हिस्से में { "status": "disabled" } शामिल करें. स्ट्रीम बंद होने पर, 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 डिलिवरी एंडपॉइंट, एचटीटीपीएस यूआरएल होना चाहिए. आपका डिलीवरी एंडपॉइंट (यानी कि वह एंडपॉइंट जिस पर आपको RISC इवेंट डिलीवर करने हैं) एचटीटीपीएस होना चाहिए. हम एचटीटीपी यूआरएल पर RISC इवेंट नहीं भेजते.
403 मौजूदा स्ट्रीम कॉन्फ़िगरेशन में, RISC के लिए खास जानकारी के मुताबिक डिलीवरी का तरीका नहीं है. आपके Google Cloud प्रोजेक्ट में, RISC कॉन्फ़िगरेशन पहले से मौजूद होना चाहिए. अगर Firebase का इस्तेमाल किया जा रहा है और आपने Google से साइन इन करने की सुविधा चालू की है, तो Firebase आपके प्रोजेक्ट के लिए RISC को मैनेज करेगा. आपके पास कस्टम कॉन्फ़िगरेशन बनाने का विकल्प नहीं होगा. अगर Firebase प्रोजेक्ट के लिए Google साइन-इन का इस्तेमाल नहीं किया जा रहा है, तो कृपया इसे बंद करें. इसके बाद, एक घंटे बाद फिर से अपडेट करने की कोशिश करें.
403 प्रोजेक्ट नहीं मिला. पक्का करें कि आपने सही प्रोजेक्ट के लिए सही सेवा खाते का इस्तेमाल किया हो. ऐसा हो सकता है कि आप मिटाए गए प्रोजेक्ट से जुड़े किसी सेवा खाते का इस्तेमाल कर रहे हों. किसी प्रोजेक्ट से जुड़े सभी सेवा खातों को देखने का तरीका जानें.
403 सेवा खाते को आपके RISC कॉन्फ़िगरेशन को ऐक्सेस करने की अनुमति चाहिए अपने प्रोजेक्ट पर जाएं API Console और उस सेवा खाते को "आरआईएससी कॉन्फ़िगरेशन एडमिन" भूमिका (roles/riscconfigs.admin) असाइन करें जो आपके प्रोजेक्ट को कॉल कर रहा है. इसके लिए, ये निर्देश फॉलो करें.
403 स्ट्रीम मैनेजमेंट एपीआई को सिर्फ़ सेवा खाते से कॉल किया जाना चाहिए. सेवा खाते से Google API को कॉल करने के तरीके के बारे में यहां ज़्यादा जानकारी दी गई है.
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 टैग के साथ पोस्ट करें.