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

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

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

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

'सभी खातों की सुरक्षा' सुविधा, आरएससी के स्टैंडर्ड पर आधारित है. इसे ओपन आईडी फ़ाउंडेशन में बनाया गया है.

खास जानकारी

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

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

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

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

पहले से आवश्यक

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

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

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

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

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

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

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

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

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

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

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

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

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

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

इवेंट पाने वाले का एंडपॉइंट बनाएं

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

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

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

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

  1. Google के आरआईएससी कॉन्फ़िगरेशन दस्तावेज़ से, क्रॉस-खाता सुरक्षा आइडेंटिफ़ायर आइडेंटिफ़ायर (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 खाता आईडी, वही आइडेंटिफ़ायर (sub) है जो नए 'Google से साइन इन करें' (JavaScript, एचटीएमएल) लाइब्रेरी, पुरानी Google साइन-इन लाइब्रेरी या OpenID Connect से जारी किए गए JWT आईडी टोकन में मौजूद है. जब 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-purged सुझाया गया: उपयोगकर्ता का खाता मिटाएं या उसे साइन इन करने का दूसरा तरीका बताएं.
https://schemas.openid.net/secevent/risc/event-type/account-credential-change-required सुझाया गया: अपने कारोबार की सेवा से जुड़ी संदिग्ध गतिविधि पर नज़र रखें और ज़रूरी कार्रवाई करें.
https://schemas.openid.net/secevent/risc/event-type/verification राज्य=state सुझाव: लॉग करें कि टेस्ट टोकन मिला है.

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

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

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

रिसीव करने वाले को रजिस्टर करें

सुरक्षा से जुड़ी गतिविधियां पाने के लिए, आरआईएससी एपीआई का इस्तेमाल करके, रिसीवर एंडपॉइंट को रजिस्टर करें. 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 स्ट्रीम कॉन्फ़िगरेशन API को कॉल करें

अब जब आपको ऑथराइज़ेशन टोकन मिल गया है, तो अपने प्रोजेक्ट की सुरक्षा से जुड़ी इवेंट स्ट्रीम को कॉन्फ़िगर करने के लिए, 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 का अनुमति पा चुके अनुरोध करें. स्ट्रीम बंद होने पर, Google आपके एंडपॉइंट पर इवेंट नहीं भेजता. साथ ही, इवेंट होने पर सुरक्षा से जुड़ी कोई गड़बड़ी नहीं होती. इवेंट स्ट्रीम को फिर से चालू करने के लिए, उसी एंडपॉइंट पर { "status": "enabled" } पोस्ट करें.

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

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

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

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

इस स्टेटस का इस्तेमाल नहीं किया जा सकता.

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

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

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

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

नया स्ट्रीम कॉन्फ़िगरेशन बनाने के लिए, https://risc.googleapis.com/v1beta/stream:update एंडपॉइंट को कॉल करें.
4XX/5XX स्थिति अपडेट नहीं की जा सकी. ज़्यादा जानकारी के लिए, गड़बड़ी का ब्यौरा देने वाला मैसेज देखें.

ऐक्सेस टोकन के दायरे

अगर आपको आरआईएससी एपीआई की पुष्टि करने के लिए, ऐक्सेस टोकन इस्तेमाल करने हैं, तो ये ऐसे दायरे हैं जिनका आपके ऐप्लिकेशन को अनुरोध करना चाहिए:

एंडपॉइंट दायरा
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 पर पोस्ट करें.