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

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

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

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

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

खास जानकारी

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

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

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

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

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

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

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

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

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

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

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

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

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

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

आरआईएससी एपीआई को चालू करने के लिए:

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

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

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

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

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

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

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

अपने रिसीवर को रजिस्टर करें

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

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

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

आरआईएससी एपीआई के लिए, अनुमति देने वाला टोकन जनरेट किया जा सकता है. इसके लिए, सेवा खाते के नाम पर काम करने की सुविधा के साथ Google Cloud CLI (gcloud) का इस्तेमाल करें. हमारा सुझाव है कि ऐसा तब करें, जब iam.disableServiceAccountKeyCreation लागू हो या सीएलआई को एक बार सेट अप करना हो. इसके अलावा, सेवा खाते के निजी पासकोड का इस्तेमाल करके, स्थानीय तौर पर JWT पर हस्ताक्षर करके भी टोकन जनरेट किया जा सकता है.

पहला विकल्प: gcloud का इस्तेमाल करके, कुछ समय के लिए मान्य ऐक्सेस टोकन जनरेट करना (इसके लिए, JSON कुंजी की ज़रूरत नहीं होती)

अगर आपके उपयोगकर्ता खाते के पास सेवा खाते पर, सेवा खाता टोकन क्रिएटर की भूमिका (roles/iam.serviceAccountTokenCreator) है, तो सीधे अपने टर्मिनल से, ज़रूरी आरआईएससी कॉन्फ़िगरेशन के दायरे के साथ, कम समय के लिए मान्य OAuth 2.0 ऐक्सेस टोकन जनरेट किया जा सकता है:

AUTH_TOKEN=$(gcloud auth print-access-token \
  --impersonate-service-account=SERVICE_ACCOUNT_EMAIL \
  --scopes=https://www.googleapis.com/auth/risc.configuration.readwrite,https://www.googleapis.com/auth/risc.verify,https://www.googleapis.com/auth/risc.status.readwrite)

आरआईएससी एपीआई के लिए उपलब्ध OAuth 2.0 के दायरों के बारे में ज़्यादा जानने के लिए, ऐक्सेस टोकन के दायरे देखें.

विकल्प B: सेवा खाते की कुंजी का इस्तेमाल करके, खुद हस्ताक्षर किया हुआ JWT बनाना

इसके अलावा, नेटवर्क दोतरफ़ा यात्रा के बिना स्थानीय तौर पर ऑथराइज़ेशन टोकन जनरेट करने के लिए, इन दावों के साथ 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')

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

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

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

इसके लिए, 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 पर अनुमति वाला जीईटी अनुरोध करके, मौजूदा स्ट्रीम कॉन्फ़िगरेशन पाएं. इसके बाद, रिस्पॉन्स बॉडी में बदलाव करें और बदले गए कॉन्फ़िगरेशन को https://risc.googleapis.com/v1beta/stream:update पर POST करें. इसके बारे में ऊपर बताया गया है.

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

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

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

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

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

आरआईएससी एपीआई से ये गड़बड़ियां मिल सकती हैं:

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