सर्वर से सर्वर ऐप्लिकेशन के लिए OAuth 2.0 का उपयोग करना

अभी तक किसी भी व्यक्ति ने चेक इन नहीं किया है

Google OAuth 2.0 सिस्टम, सर्वर-टू-सर्वर इंटरैक्शन के साथ काम करता है, जैसे कि वेब के बीच होने वाले इंटरैक्शन एक Google सेवा की तरह. ऐसी स्थिति के लिए, आपको एक सेवा खाते की ज़रूरत होगी, जो वह खाता है जो किसी व्यक्तिगत असली उपयोगकर्ता के बजाय आपके ऐप्लिकेशन से जुड़ा है. आपका ऐप्लिकेशन, सेवा खाते की ओर से Google API को कॉल करता है. इसलिए, उपयोगकर्ता सीधे तौर पर शामिल हैं. इस स्थिति को कभी-कभी "दो पैरों वाला OAuth" भी कहा जाता है. या "2LO". (संबंधित शब्द "तीन पैरों वाला OAuth" उन स्थितियों के बारे में बताता है जिनमें आपका ऐप्लिकेशन, Google API को आपकी ओर से कॉल करता है और जिनके लिए कभी-कभी उपयोगकर्ता की सहमति की ज़रूरत होती है.)

आम तौर पर, जब कोई ऐप्लिकेशन काम करने के लिए Google API का इस्तेमाल करता है, तो वह सेवा खाते का इस्तेमाल करता है उपयोगकर्ता के डेटा के बजाय उसके अपने डेटा के साथ होता है. उदाहरण के लिए, Google Cloud का इस्तेमाल करने वाला ऐप्लिकेशन डेटा परसिस्टेंस के लिए Datastore, सेवा खाते का इस्तेमाल करेगा, ताकि Google Cloud Datastore API.

Google Workspace के डोमेन एडमिन ये काम भी कर सकते हैं उपयोगकर्ता को ऐक्सेस करने के लिए सेवा खातों को डोमेन के हिसाब से अधिकार दें अपने अन्य डेटा को ऐक्सेस करने की अनुमति दें.

इस दस्तावेज़ में बताया गया है कि कोई ऐप्लिकेशन, सर्वर-टू-सर्वर OAuth 2.0 फ़्लो को Google API क्लाइंट लाइब्रेरी (सुझाया गया) या एचटीटीपी का इस्तेमाल करके.

खास जानकारी

सर्वर-टू-सर्वर इंटरैक्शन में मदद करने के लिए, सबसे पहले इसमें अपने प्रोजेक्ट के लिए सेवा खाता बनाएं API Console. अगर आपको इन देशों के उपयोगकर्ताओं का डेटा ऐक्सेस करना है, तो ऐसा करने के लिए, आपको पूरे डोमेन के सेवा खाते का ऐक्सेस देना होगा.

इसके बाद, आपका ऐप्लिकेशन सेवा खाते के OAuth 2.0 पुष्टि करने वाले सर्वर से ऐक्सेस टोकन का अनुरोध करने के लिए क्रेडेंशियल.

आखिर में, आपका ऐप्लिकेशन Google API को कॉल करने के लिए, ऐक्सेस टोकन का इस्तेमाल कर सकता है.

सेवा खाता बनाया जा रहा है

सेवा खाते के क्रेडेंशियल में जनरेट किया गया ईमेल पता शामिल होता है. यह ईमेल पता कम से कम यूनीक होना चाहिए एक सार्वजनिक/निजी कुंजी का जोड़ा होता है. अगर पूरे डोमेन के लिए डेटा का ऐक्सेस पाने की सुविधा चालू है, तो Client-ID भी इस हिस्से का हिस्सा होता है इस्तेमाल करने की अनुमति नहीं है.

अगर आपका ऐप्लिकेशन Google App Engine पर चलता है, तो सेवा खाता अपने-आप सेट अप हो जाता है. तो आपको अपना प्रोजेक्ट बनाना चाहिए.

अगर आपका ऐप्लिकेशन Google Compute Engine पर चलता है, तो सेवा खाता भी सेट अप किया जाता है जब आप प्रोजेक्ट बनाते हैं, तो आपको अपने-आप ऐसे दायरे तय करने होते हैं जो Google Compute Engine इंस्टेंस बनाने के दौरान, ऐप्लिकेशन को इसका ऐक्सेस चाहिए. ज़्यादा के लिए जानकारी, देखें सेवा खाते इस्तेमाल करने के लिए, किसी इंस्टेंस को तैयार करना.

अगर आपका ऐप्लिकेशन Google App Engine या Google Compute Engine पर नहीं चलता है, तो आपको ये क्रेडेंशियल, Google API Consoleमें मौजूद हैं. सेवा खाता जनरेट करने के लिए क्रेडेंशियल या पहले से जनरेट किए गए सार्वजनिक क्रेडेंशियल देखने के लिए, ये काम करें:

First, create a service account:

  1. Open the Service accounts page.
  2. If prompted, select a project, or create a new one.
  3. Click  Create service account.
  4. Under Service account details, type a name, ID, and description for the service account, then click Create and continue.
  5. Optional: Under Grant this service account access to project, select the IAM roles to grant to the service account.
  6. Click Continue.
  7. Optional: Under Grant users access to this service account, add the users or groups that are allowed to use and manage the service account.
  8. Click Done.

Next, create a service account key:

  1. Click the email address for the service account you created.
  2. Click the Keys tab.
  3. In the Add key drop-down list, select Create new key.
  4. Click Create.

Your new public/private key pair is generated and downloaded to your machine; it serves as the only copy of the private key. You are responsible for storing it securely. If you lose this key pair, you will need to generate a new one.

आप ईमेल पता देखने के लिए किसी भी समय, सार्वजनिक रूप से, API Console का इस्तेमाल किया जा सकता है. इसके लिए सेवा खाते के क्रेडेंशियल के बारे में ज़्यादा जानकारी के लिए, API Console, देखें API Consoleमें सेवा खाते सहायता फ़ाइल में दी गई है.

सेवा खाते के ईमेल पते का ध्यान रखें और सेवा खाते की निजी कुंजी को सेव करें फ़ाइल को किसी ऐसी जगह पर रखें जहां से आपका ऐप्लिकेशन इसे ऐक्सेस कर सके. आपके ऐप्लिकेशन को यह अनुमति देनी होगी अनुमति वाले एपीआई कॉल.

सेवा खाते को डोमेन के अधिकार देने का काम करना

Google Workspace खाते का इस्तेमाल करके, संगठन का Workspace एडमिन एक ऐप्लिकेशन है, जो Google Workspace डोमेन के उपयोगकर्ताओं का डेटा ऐक्सेस करने की अनुमति देता है. उदाहरण के लिए, एक ऐसा ऐप्लिकेशन जो इसके सभी उपयोगकर्ताओं के कैलेंडर में इवेंट जोड़ने के लिए Google Calendar API का इस्तेमाल करता है अगर कोई Google Workspace डोमेन, Google Calendar API को ऐक्सेस करने के लिए सेवा खाते का इस्तेमाल करेगा, तो शेयर किया जा सकता है. किसी डोमेन के उपयोगकर्ताओं की ओर से, सेवा खाते को डेटा ऐक्सेस करने की अनुमति देना इसे कभी-कभी "पूरे डोमेन पर अधिकार देने वाली संस्था" भी कहा जाता है सेवा खाते को लिंक किया जा सकता है.

पूरे डोमेन का अधिकार किसी सेवा खाते को देने के लिए, Google का सुपर एडमिन Workspace डोमेन को ये चरण पूरे करने होंगे:

  1. आपके Google Workspace डोमेन के से Admin console, मुख्य मेन्यू पर जाएं सुरक्षा > ऐक्सेस और डेटा कंट्रोल > एपीआई की सेटिंग.
  2. पूरे डोमेन के लोगों को डेटा का ऐक्सेस दें पैनल में, पूरे डोमेन के लोगों को डेटा का ऐक्सेस दें विकल्प को चुनें.
  3. नया जोड़ें पर क्लिक करें.
  4. क्लाइंट आईडी फ़ील्ड में, सेवा खाते का क्लाइंट आईडी डालें. आप आपके सेवा खाते का क्लाइंट आईडी Service accounts page.
  5. OAuth के दायरे (कॉमा-डीलिमिटेड) फ़ील्ड में, उन दायरों की सूची डालें जिन्हें आपके ऐप्लिकेशन को इसकी ऐक्सेस दी जानी चाहिए. उदाहरण के लिए, अगर आपके ऐप्लिकेशन को पूरे डोमेन पर Google Drive API और Google Calendar API का पूरा ऐक्सेस दें, तो यह डालें: https://www.googleapis.com/auth/drive, https://www.googleapis.com/auth/calendar.
  6. अनुमति दें पर क्लिक करें.

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

किसी दूसरे उपयोगकर्ता को एपीआई कॉल करने की तैयारी की जा रही है

Java

आपको API Console, Java के लिए Google API क्लाइंट लाइब्रेरी सेवा खाते के क्रेडेंशियल से GoogleCredential ऑब्जेक्ट बनाने के लिए और वे दायरे जिनका ऐक्सेस आपके ऐप्लिकेशन को चाहिए. उदाहरण के लिए:

import com.google.api.client.googleapis.auth.oauth2.GoogleCredential;
import com.google.api.services.sqladmin.SQLAdminScopes;

// ...

GoogleCredential credential = GoogleCredential.fromStream(new FileInputStream("MyProject-1234.json"))
    .createScoped(Collections.singleton(SQLAdminScopes.SQLSERVICE_ADMIN));

अगर आपको Google Cloud Platform पर कोई ऐप्लिकेशन डेवलप करना है, तो ऐप्लिकेशन के डिफ़ॉल्ट क्रेडेंशियल इससे यह प्रोसेस आसान हो जाती है.

पूरे डोमेन के लिए, अपने ईमेल खाते का ऐक्सेस दें

अगर आपने सेवा खाते को पूरे डोमेन के लिए ऐक्सेस दिया है और आपको किसी दूसरे के नाम पर काम करना है तो उपयोगकर्ता खाते का ईमेल पता GoogleCredential ऑब्जेक्ट में से createDelegated तरीका. इसके लिए उदाहरण:

GoogleCredential credential = GoogleCredential.fromStream(new FileInputStream("MyProject-1234.json"))
    .createScoped(Collections.singleton(SQLAdminScopes.SQLSERVICE_ADMIN))
    .createDelegated("workspace-user@example.com");

ऊपर दिया गया कोड अपने createDelegated() को कॉल करने के लिए, GoogleCredential ऑब्जेक्ट का इस्तेमाल करता है तरीका. createDelegated() तरीके के लिए आर्ग्युमेंट, ऐसा उपयोगकर्ता होना चाहिए जो आपकी Workspace खाता चुनें. अनुरोध करने वाला कोड, Google को कॉल करने के लिए इस क्रेडेंशियल का इस्तेमाल करेगा आपके सेवा खाते का इस्तेमाल करने वाले एपीआई.

Python

आपको API Console, Python के लिए Google API क्लाइंट लाइब्रेरी इन चरणों को पूरा करने के लिए:

  1. सेवा खाते के क्रेडेंशियल का इस्तेमाल करके Credentials ऑब्जेक्ट बनाएं और उन दायरों के ऐक्सेस की ज़रूरत होती है जिनका ऐक्सेस आपके ऐप्लिकेशन को चाहिए. जैसे:
    from google.oauth2 import service_account
    
    SCOPES = ['https://www.googleapis.com/auth/sqlservice.admin']
    SERVICE_ACCOUNT_FILE = '/path/to/service.json'
    
    credentials = service_account.Credentials.from_service_account_file(
            SERVICE_ACCOUNT_FILE, scopes=SCOPES)
    अभी तक किसी भी व्यक्ति ने चेक इन नहीं किया है

    अगर आप Google Cloud Platform पर कोई ऐप्लिकेशन डेवलप कर रहे हैं, तो आप ऐप्लिकेशन के डिफ़ॉल्ट क्रेडेंशियल इससे यह प्रोसेस आसान हो सकती है.

  2. पूरे डोमेन के लिए, अपने ईमेल खाते का ऐक्सेस दें

    अगर आपने सेवा खाते को पूरे डोमेन के लिए ऐक्सेस दिया है और आपको किसी उपयोगकर्ता खाते के नाम पर काम करें, किसी मौजूदा खाते में से with_subject तरीके का इस्तेमाल करें ServiceAccountCredentials ऑब्जेक्ट. उदाहरण के लिए:

    delegated_credentials = credentials.with_subject('user@example.org')

अपने ऐप्लिकेशन में Google API को कॉल करने के लिए, क्रेडेंशियल ऑब्जेक्ट का इस्तेमाल करें.

एचटीटीपी/REST

आपको API Console, आपके आवेदन को इसके लिए, नीचे दिया गया तरीका अपनाएं:

  1. ऐसा JSON वेब टोकन (JWT, उच्चारण, "जोट") बनाएं जिसमें हेडर, दावा सेट, और एक हस्ताक्षर.
  2. Google OAuth 2.0 ऑथराइज़ेशन सर्वर से ऐक्सेस टोकन का अनुरोध करें.
  3. ऑथराइज़ेशन सर्वर से मिले JSON रिस्पॉन्स को मैनेज करें.

इसके बाद आने वाले सेक्शन में, इन चरणों को पूरा करने का तरीका बताया गया है.

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

जब ऐक्सेस टोकन की समयसीमा खत्म हो जाती है, तब आपका ऐप्लिकेशन दूसरा टोकन जनरेट करता है JWT, इस पर साइन करता है और किसी दूसरे ऐक्सेस टोकन का अनुरोध करता है.

आपका सर्वर ऐप्लिकेशन, Google से टोकन मांगने के लिए JWT का इस्तेमाल करता है
                  इसके बाद, ऑथराइज़ेशन सर्वर, Google API एंडपॉइंट को कॉल करने के लिए टोकन का इस्तेमाल करता है. नहीं
                  भी असली उपयोगकर्ता की मदद कैसे की जाती है.

इस सेक्शन के बाकी हिस्से में, JWT बनाने के बारे में बताया गया है. ऐक्सेस टोकन का अनुरोध करके और रिस्पॉन्स को मैनेज करता है.

JWT बनाना

JWT के तीन हिस्से होते हैं: हेडर, क्लेम सेट, और हस्ताक्षर करें. हेडर और दावे का सेट, JSON ऑब्जेक्ट होते हैं. ये JSON ऑब्जेक्ट, क्रम से लगाए जाते हैं UTF-8 बाइट, फिर Base64url एन्कोडिंग का इस्तेमाल करके एन्कोड किया गया. यह एन्कोडिंग लचीलीता देती है कोड में बदलने के बार-बार किए जाने वाले ऑपरेशन की वजह से, कोड में बदलने के तरीके में हुए बदलाव से बचा जा सकता है. हेडर, दावा सेट, और हस्ताक्षर को एक विराम चिह्न (.) वर्ण के साथ जोड़ा जाता है.

JWT इस तरह तैयार किया जाता है:

{Base64url encoded header}.{Base64url encoded claim set}.{Base64url encoded signature}

सिग्नेचर की बेस स्ट्रिंग इस तरह है:

{Base64url encoded header}.{Base64url encoded claim set}
JWT हेडर बनाना

हेडर में तीन फ़ील्ड होते हैं जो साइनिंग एल्गोरिदम को दिखाते हैं. हेडर का फ़ॉर्मैट दावा और [सेवा खाते का कुंजी आईडी key](https://cloud.google.com/iam/docs/reference/rest/v1/projects.serviceAccounts.keys) इसका इस्तेमाल JWT पर हस्ताक्षर करने के लिए किया जाता था. एल्गोरिदम और फ़ॉर्मैट ज़रूरी हैं. हर फ़ील्ड में सिर्फ़ एक वैल्यू का इस्तेमाल करें. ज़्यादा एल्गोरिदम और फ़ॉर्मैट आने पर, यह हेडर बदल जाएगा उसी के हिसाब से. कुंजी का आईडी ज़रूरी नहीं है. अगर गलत कुंजी आईडी दिया गया है, तो GCP कोशिश करेगा टोकन की पुष्टि करने और टोकन को अस्वीकार करने के लिए, सेवा खाते से जुड़ी सभी कुंजियां कोई मान्य कुंजी नहीं मिली. Google गलत कुंजी आईडी वाले टोकन अस्वीकार करने का अधिकार सुरक्षित रखता है आने वाले समय में.

सेवा खाते, आरएसए SHA-256 एल्गोरिदम और JWT टोकन फ़ॉर्मैट का इस्तेमाल करते हैं. इस वजह से, हेडर का JSON फ़ॉर्मैट इस तरह है:

{"alg":"RS256","typ":"JWT", "kid":"370ab79b4513eb9bad7c9bd16a95cb76b5b2a56a"}

इसे Base64url से दिखाया गया है:

          eyJhbGciOiJSUzI1NiIsInR5cCI6IkpXVCIsICJraWQiOiIzNzBhYjc5YjQ1MTNlYjliYWQ3YzliZDE2YTk1Y2I3NmI1YjJhNTZhIn0=
JWT दावा सेट बनाना

JWT के दावे सेट में JWT के बारे में जानकारी होती है, जिसमें ये अनुमतियां शामिल होती हैं अनुरोध किया गया (स्कोप), टोकन का टारगेट, जारी करने वाला, टोकन जारी करने का समय, यह टोकन कब तक मौजूद रहेगा. ज़्यादातर फ़ील्ड ज़रूरी हैं. JWT हेडर की तरह, JWT दावा सेट एक JSON ऑब्जेक्ट है और इसका उपयोग हस्ताक्षर की गणना में किया जाता है.

आवश्यक दावे

JWT दावा सेट में आवश्यक दावे नीचे दिखाए गए हैं. ये विज्ञापन फ़ॉर्म में किसी भी क्रम में दिख सकते हैं दावा सेट किया गया है.

नाम ब्यौरा
iss सेवा खाते का ईमेल पता.
scope ऐप्लिकेशन जिन अनुमतियों के लिए अनुरोध करता है उनकी सूची, स्पेस के ज़रिए अलग-अलग करके दी जाती है.
aud दावे के सही टारगेट की जानकारी. ऐक्सेस टोकन बनाते समय अनुरोध करें कि यह वैल्यू हमेशा https://oauth2.googleapis.com/token होती है.
exp दावे की समयसीमा खत्म होने का समय, जिसे 00:00:00 यूटीसी के बाद सेकंड के तौर पर बताया गया है, 1 जनवरी, 1970. यह वैल्यू, जारी किए गए समय के बाद ज़्यादा से ज़्यादा एक घंटे की होती है.
iat दावा जारी किए जाने का समय, जो 00:00:00 यूटीसी से सेकंड के तौर पर बताया गया है, 1 जनवरी, 1970.

JWT दावा सेट में आवश्यक फ़ील्ड का JSON प्रतिनिधित्व नीचे दिखाया गया है:

{
  "iss": "761326798069-r5mljlln1rd4lrbhg75efgigp36m78j5@developer.gserviceaccount.com",
  "scope": "https://www.googleapis.com/auth/devstorage.read_only",
  "aud": "https://oauth2.googleapis.com/token",
  "exp": 1328554385,
  "iat": 1328550785
}
अतिरिक्त दावे

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

ऐप्लिकेशन को संसाधन का ऐक्सेस देने वाले ऐप्लिकेशन को देने वाले ऐक्सेस टोकन को पाने के लिए, उपयोगकर्ता का ईमेल पता शामिल करके JWT दावा करता है, जो sub फ़ील्ड.

नाम ब्यौरा
sub उस उपयोगकर्ता का ईमेल पता जिसके लिए ऐप्लिकेशन ऐक्सेस करने का अनुरोध कर रहा है ऐक्सेस दें.

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

यह JWT दावा सेट का एक उदाहरण है जिसमें sub फ़ील्ड शामिल है नीचे दिया गया है:

{
  "iss": "761326798069-r5mljlln1rd4lrbhg75efgigp36m78j5@developer.gserviceaccount.com",
  "sub": "some.user@example.com",
  "scope": "https://www.googleapis.com/auth/prediction",
  "aud": "https://oauth2.googleapis.com/token",
  "exp": 1328554385,
  "iat": 1328550785
}
JWT दावा सेट को एन्कोड करना

JWT हेडर की तरह, JWT दावा सेट को UTF-8 और Base64url-safe में क्रम से लगाया जाना चाहिए एन्कोड किया गया हो. नीचे JWT दावा सेट के लिए JSON प्रतिनिधित्व का एक उदाहरण दिया गया है:

{
  "iss": "761326798069-r5mljlln1rd4lrbhg75efgigp36m78j5@developer.gserviceaccount.com",
  "scope": "https://www.googleapis.com/auth/prediction",
  "aud": "https://oauth2.googleapis.com/token",
  "exp": 1328554385,
  "iat": 1328550785
}
हस्ताक्षर की गणना की जा रही है

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

{Base64url encoded header}.{Base64url encoded claim set}

हस्ताक्षर को कैलकुलेट करते समय, JWT हेडर में मौजूद साइनिंग एल्गोरिदम का इस्तेमाल किया जाना चाहिए. कॉन्टेंट बनाने आरएसए का इस्तेमाल करके, सिर्फ़ Google OAuth 2.0 ऑथराइज़ेशन सर्वर पर चलने वाले साइनिंग एल्गोरिदम की सुविधा का इस्तेमाल किया जाता है SHA-256 हैशिंग एल्गोरिदम. इसे alg में RS256 के तौर पर दिखाया गया है फ़ील्ड दिखाई देगा.

SHA256withRSA (इसे भी कहा जाता है) का इस्तेमाल करके, इनपुट के UTF-8 प्रज़ेंटेशन पर हस्ताक्षर करें SHA-256 हैश फ़ंक्शन के साथ RSASSA-PKCS1-V1_5-SIGN) और इनसे मिली निजी कुंजी के साथ Google API Console. आउटपुट एक बाइट अरे होगा.

इसके बाद, सिग्नेचर को Base64url के तौर पर एन्कोड करना होगा. इसमें हेडर, दावा सेट, और हस्ताक्षर शामिल हैं पूर्ण विराम (.) वर्ण के साथ जोड़ा गया है. इसका नतीजा JWT है. यह यह होना चाहिए (साफ़ तौर पर जानकारी देने के लिए लाइन ब्रेक जोड़े गए हैं):

{Base64url encoded header}.
{Base64url encoded claim set}.
{Base64url encoded signature}

नीचे Base64url एन्कोडिंग से पहले के JWT का उदाहरण दिया गया है:

{"alg":"RS256","typ":"JWT"}.
{
"iss":"761326798069-r5mljlln1rd4lrbhg75efgigp36m78j5@developer.gserviceaccount.com",
"scope":"https://www.googleapis.com/auth/prediction",
"aud":"https://oauth2.googleapis.com/token",
"exp":1328554385,
"iat":1328550785
}.
[signature bytes]

यहां एक JWT का उदाहरण दिया गया है, जिस पर हस्ताक्षर किए गए हैं और वह ट्रांसमिशन के लिए तैयार है:

eyJhbGciOiJSUzI1NiIsInR5cCI6IkpXVCJ9.eyJpc3MiOiI3NjEzMjY3OTgwNjktcjVtbGpsbG4xcmQ0bHJiaGc3NWVmZ2lncDM2bTc4ajVAZGV2ZWxvcGVyLmdzZXJ2aWNlYWNjb3VudC5jb20iLCJzY29wZSI6Imh0dHBzOi8vd3d3Lmdvb2dsZWFwaXMuY29tL2F1dGgvcHJlZGljdGlvbiIsImF1ZCI6Imh0dHBzOi8vd3d3Lmdvb2dsZWFwaXMuY29tL29hdXRoMi92NC90b2tlbiIsImV4cCI6MTMyODU1NDM4NSwiaWF0IjoxMzI4NTUwNzg1fQ.UFUt59SUM2_AW4cRU8Y0BYVQsNTo4n7AFsNrqOpYiICDu37vVt-tw38UKzjmUKtcRsLLjrR3gFW3dNDMx_pL9DVjgVHDdYirtrCekUHOYoa1CMR66nxep5q5cBQ4y4u2kIgSvChCTc9pmLLNoIem-ruCecAJYgI9Ks7pTnW1gkOKs0x3YpiLpzplVHAkkHztaXiJdtpBcY1OXyo6jTQCa3Lk2Q3va1dPkh_d--GU2M5flgd8xNBPYw4vxyt0mP59XZlHMpztZt0soSgObf7G3GXArreF_6tpbFsS3z2t5zkEiHuWJXpzcYr5zWTRPDEHsejeBSG8EgpLDce2380ROQ

ऐक्सेस टोकन के लिए अनुरोध करना

हस्ताक्षर किया गया JWT जनरेट करने के बाद, कोई ऐप्लिकेशन इसका इस्तेमाल, ऐक्सेस टोकन का अनुरोध करने के लिए कर सकता है. ऐक्सेस टोकन का यह अनुरोध, एचटीटीपीएस POST के तौर पर किया गया है और इसका मुख्य हिस्सा यूआरएल है एन्कोड किया गया हो. यूआरएल नीचे दिखाया गया है:

https://oauth2.googleapis.com/token

एचटीटीपीएस POST अनुरोध में, ये पैरामीटर ज़रूरी हैं:

नाम ब्यौरा
grant_type ज़रूरत के हिसाब से यूआरएल के कोड में बदली गई इस स्ट्रिंग का इस्तेमाल करें: urn:ietf:params:oauth:grant-type:jwt-bearer अभी तक किसी भी व्यक्ति ने चेक इन नहीं किया है
assertion JWT, जिसमें हस्ताक्षर शामिल है.

यहां किसी ऐक्सेस टोकन में इस्तेमाल किए गए एचटीटीपीएस POST अनुरोध का रॉ डंप दिया गया है अनुरोध:

POST /token HTTP/1.1
Host: oauth2.googleapis.com
Content-Type: application/x-www-form-urlencoded

grant_type=urn%3Aietf%3Aparams%3Aoauth%3Agrant-type%3Ajwt-bearer&assertion=eyJhbGciOiJSUzI1NiIsInR5cCI6IkpXVCJ9.eyJpc3MiOiI3NjEzMjY3OTgwNjktcjVtbGpsbG4xcmQ0bHJiaGc3NWVmZ2lncDM2bTc4ajVAZGV2ZWxvcGVyLmdzZXJ2aWNlYWNjb3VudC5jb20iLCJzY29wZSI6Imh0dHBzOi8vd3d3Lmdvb2dsZWFwaXMuY29tL2F1dGgvcHJlZGljdGlvbiIsImF1ZCI6Imh0dHBzOi8vYWNjb3VudHMuZ29vZ2xlLmNvbS9vL29hdXRoMi90b2tlbiIsImV4cCI6MTMyODU3MzM4MSwiaWF0IjoxMzI4NTY5NzgxfQ.ixOUGehweEVX_UKXv5BbbwVEdcz6AYS-6uQV6fGorGKrHf3LIJnyREw9evE-gs2bmMaQI5_UbabvI4k-mQE4kBqtmSpTzxYBL1TCd7Kv5nTZoUC1CmwmWCFqT9RE6D7XSgPUh_jF1qskLa2w0rxMSjwruNKbysgRNctZPln7cqQ

नीचे curl का इस्तेमाल करके वही अनुरोध दिया गया है:

curl -d 'grant_type=urn%3Aietf%3Aparams%3Aoauth%3Agrant-type%3Ajwt-bearer&assertion=eyJhbGciOiJSUzI1NiIsInR5cCI6IkpXVCJ9.eyJpc3MiOiI3NjEzMjY3OTgwNjktcjVtbGpsbG4xcmQ0bHJiaGc3NWVmZ2lncDM2bTc4ajVAZGV2ZWxvcGVyLmdzZXJ2aWNlYWNjb3VudC5jb20iLCJzY29wZSI6Imh0dHBzOi8vd3d3Lmdvb2dsZWFwaXMuY29tL2F1dGgvcHJlZGljdGlvbiIsImF1ZCI6Imh0dHBzOi8vYWNjb3VudHMuZ29vZ2xlLmNvbS9vL29hdXRoMi90b2tlbiIsImV4cCI6MTMyODU3MzM4MSwiaWF0IjoxMzI4NTY5NzgxfQ.RZVpzWygMLuL-n3GwjW1_yhQhrqDacyvaXkuf8HcJl8EtXYjGjMaW5oiM5cgAaIorrqgYlp4DPF_GuncFqg9uDZrx7pMmCZ_yHfxhSCXru3gbXrZvAIicNQZMFxrEEn4REVuq7DjkTMyCMGCY1dpMa8aWfTQFt3Eh7smLchaZsU
' https://oauth2.googleapis.com/token

जवाब को मैनेज करना

अगर JWT और ऐक्सेस टोकन का अनुरोध सही तरीके से बनाया गया है और सेवा खाते में कार्रवाई करने की अनुमति है, फिर प्राधिकरण सर्वर से JSON प्रतिसाद मिलता है में एक ऐक्सेस टोकन शामिल होता है. रिस्पॉन्स का यह एक उदाहरण है:

{
  "access_token": "1/8xbJqaOZXSUZbHLl5EOtu1pxz3fmmetKx9W8CV4t79M",
  "scope": "https://www.googleapis.com/auth/prediction"
  "token_type": "Bearer",
  "expires_in": 3600
}

expires_in वैल्यू.

Calling Google API

Java

Google API को कॉल करने के लिए, GoogleCredential ऑब्जेक्ट का इस्तेमाल करें. इसके लिए, इसके लिए, नीचे दिया गया तरीका अपनाएं:

  1. उस एपीआई के लिए सेवा ऑब्जेक्ट बनाएं जिसे आपको GoogleCredential ऑब्जेक्ट. उदाहरण के लिए:
    SQLAdmin sqladmin =
        new SQLAdmin.Builder(httpTransport, JSON_FACTORY, credential).build();
  2. एपीआई सेवा से अनुरोध करने के लिए, सर्विस ऑब्जेक्ट से मिला इंटरफ़ेस. उदाहरण के लिए, रोमांचक-उदाहरण-123 में Cloud SQL डेटाबेस के इंस्टेंस की सूची बनाने के लिए प्रोजेक्ट:
    SQLAdmin.Instances.List instances =
        sqladmin.instances().list("exciting-example-123").execute();
    अभी तक किसी भी व्यक्ति ने चेक इन नहीं किया है

Python

Google API को कॉल करने के लिए, अनुमति वाले Credentials ऑब्जेक्ट का इस्तेमाल करें. इसके लिए, इसके लिए, नीचे दिया गया तरीका अपनाएं:

  1. जिस एपीआई को कॉल करना है उसके लिए सेवा ऑब्जेक्ट बनाएं. सेवा ऑब्जेक्ट बनाया जाता है API के नाम और वर्शन के साथ build फ़ंक्शन को कॉल करके और Credentials ऑब्जेक्ट को अनुमति दी गई. उदाहरण के लिए, Cloud SQL एडमिन एपीआई:
    import googleapiclient.discovery
    
    sqladmin = googleapiclient.discovery.build('sqladmin', 'v1beta3', credentials=credentials)
    अभी तक किसी भी व्यक्ति ने चेक इन नहीं किया है
  2. एपीआई सेवा से अनुरोध करने के लिए, सर्विस ऑब्जेक्ट से मिला इंटरफ़ेस. उदाहरण के लिए, रोमांचक-उदाहरण-123 में Cloud SQL डेटाबेस के इंस्टेंस की सूची बनाने के लिए प्रोजेक्ट:
    response = sqladmin.instances().list(project='exciting-example-123').execute()
    अभी तक किसी भी व्यक्ति ने चेक इन नहीं किया है

एचटीटीपी/REST

जब आपके ऐप्लिकेशन को ऐक्सेस टोकन मिल जाता है, तब आपके पास इस टोकन का इस्तेमाल करके, Google को कॉल करने का विकल्प होता है दिए गए सेवा खाते की ओर से एपीआई या उपयोगकर्ता खाते के लिए. ऐसा करने के लिए, शामिल करें एपीआई को किए गए अनुरोध में access_token क्वेरी शामिल करके, ऐक्सेस टोकन पैरामीटर या Authorization एचटीटीपी हेडर Bearer वैल्यू. जब मुमकिन हो, एचटीटीपी हेडर को प्राथमिकता दी जाती है, क्योंकि सर्वर लॉग में क्वेरी स्ट्रिंग अक्सर दिखती हैं. ज़्यादातर मामलों में आप Google API पर अपने कॉल सेट अप करने के लिए क्लाइंट लाइब्रेरी का उपयोग कर सकते हैं (उदाहरण के लिए, Drive Files API को कॉल करना).

आप सभी Google API को आज़मा सकते हैं और यहां पर उनके दायरे देख सकते हैं OAuth 2.0 Playground.

एचटीटीपी जीईटी के उदाहरण

एक कॉल drive.files Authorization: Bearer एचटीटीपी का इस्तेमाल करके एंडपॉइंट (Drive Files API) का इस्तेमाल करना हेडर ऐसा दिख सकता है. ध्यान दें कि आपको अपना ऐक्सेस टोकन बताना होगा:

GET /drive/v2/files HTTP/1.1
Host: www.googleapis.com
Authorization: Bearer access_token

यहां access_token का इस्तेमाल करके, पुष्टि किए गए उपयोगकर्ता के लिए उसी एपीआई को कॉल किया गया है क्वेरी स्ट्रिंग पैरामीटर:

GET https://www.googleapis.com/drive/v2/files?access_token=access_token

curl के उदाहरण

curl कमांड-लाइन ऐप्लिकेशन का इस्तेमाल करके, इन कमांड की जांच की जा सकती है. यह रही उदाहरण के लिए, जो एचटीटीपी हेडर विकल्प का इस्तेमाल करता है (प्राथमिकता दी जाती है):

curl -H "Authorization: Bearer access_token" https://www.googleapis.com/drive/v2/files

इसके अलावा, क्वेरी स्ट्रिंग पैरामीटर विकल्प:

curl https://www.googleapis.com/drive/v2/files?access_token=access_token

ऐक्सेस टोकन की समयसीमा खत्म होने पर

Google OAuth 2.0 ऑथराइज़ेशन सर्वर से जारी किए गए ऐक्सेस टोकन, समयसीमा खत्म होने के बाद खत्म हो जाते हैं expires_in वैल्यू से मिलता है. जब किसी ऐक्सेस टोकन की समयसीमा खत्म हो जाती है, तो ऐप्लिकेशन को एक अन्य JWT जनरेट करना चाहिए, उस पर हस्ताक्षर करना चाहिए, और किसी अन्य पहुंच टोकन का अनुरोध करना चाहिए.

JWT गड़बड़ी कोड

error फ़ील्ड error_description फ़ील्ड मतलब समस्या कैसे हल करें
unauthorized_client Unauthorized client or scope in request. अगर आपको पूरे डोमेन के लोगों को डेटा का ऐक्सेस देने की सुविधा इस्तेमाल करनी है, तो सेवा खाते को उपयोगकर्ता के डोमेन का Admin console.

पक्का करें कि सेवा खाते को Admin console के उपयोगकर्ता के लिए पूरे डोमेन के डेटा का ऐक्सेस पेज sub दावा (फ़ील्ड).

आम तौर पर, इसमें कुछ ही मिनट लगते हैं. हालांकि, अनुमति देने में 24 घंटे लग सकते हैं सभी उपयोगकर्ताओं के लिए लागू करें.

unauthorized_client Client is unauthorized to retrieve access tokens using this method, or client not authorized for any of the scopes requested. सेवा खाते को क्लाइंट आईडी के बजाय, क्लाइंट के ईमेल पते का इस्तेमाल करके अनुमति दी गई थी (संख्या में). में Admin console में जाकर पूरे डोमेन के डेटा का ऐक्सेस दें, क्लाइंट हटाएं, और उसे फिर से जोड़ें होना चाहिए.
access_denied (कोई भी वैल्यू) अगर पूरे डोमेन के लोगों को डेटा का ऐक्सेस दिया जा रहा है, तो अनुरोध किए गए एक या उससे ज़्यादा दायरों की अनुमति नहीं है Admin console में जाएं.

पक्का करें कि सेवा खाते को Admin console के उपयोगकर्ता के लिए पूरे डोमेन के डेटा का ऐक्सेस पेज sub दावा (फ़ील्ड) और यह कि इसमें वे सभी दायरे शामिल हैं जिनके लिए आपने अनुरोध किया है आपके JWT के scope दावे में.

आम तौर पर, इसमें कुछ ही मिनट लगते हैं. हालांकि, पुष्टि करने में 24 घंटे लग सकते हैं सभी उपयोगकर्ताओं के लिए लागू करें.

admin_policy_enforced (कोई भी वैल्यू) Google खाता, अनुरोध किए गए एक या उससे ज़्यादा दायरों को अनुमति नहीं दे सकता है, क्योंकि की नीतियों का पालन करना होगा.

Google Workspace एडमिन का सहायता लेख पढ़ें यह कंट्रोल करना कि किस तीसरे पक्ष और इंटरनल ऐप्लिकेशन, Google Workspace का डेटा ऐक्सेस करते हैं. इससे हमें यह जानने में मदद मिलेगी कि एडमिन सभी दायरों या संवेदनशील और प्रतिबंधित क्षेत्रों के ऐक्सेस पर तब तक पाबंदी लगा सकता है, जब तक आपके OAuth क्लाइंट आईडी को साफ़ तौर पर ऐक्सेस दिया जाता है.

invalid_client (कोई भी वैल्यू)

OAuth क्लाइंट या JWT टोकन अमान्य है या गलत तरीके से कॉन्फ़िगर किया गया है.

ज़्यादा जानकारी के लिए गड़बड़ी की जानकारी देखें.

यह पक्का करें कि JWT टोकन मान्य है और उसमें सही दावे हैं.

यह देखना कि OAuth क्लाइंट और सेवा खाता सही तरीके से कॉन्फ़िगर किया गया है और यह कि आप सही ईमेल पते का उपयोग कर रहे हैं.

जांचें कि JWT टोकन सही है और उसे अनुरोध.

invalid_grant Not a valid email. उपयोगकर्ता मौजूद नहीं है. यह देख लें कि sub वाले दावे (फ़ील्ड) में दिया गया ईमेल पता सही हो.
invalid_grant

Invalid JWT: Token must be a short-lived token (60 minutes) and in a reasonable timeframe. Check your 'iat' and 'exp' values and use a clock with skew to account for clock differences between systems.

आम तौर पर, इसका मतलब है कि लोकल सिस्टम का समय सही नहीं है. ऐसा तब भी हो सकता है, जब exp वैल्यू, आने वाले समय में iat वैल्यू से 65 मिनट से ज़्यादा की है, या exp वैल्यू, iat वैल्यू से कम है.

पक्का करें कि सिस्टम में जहां JWT जनरेट किया गया है वह घड़ी सही है. अगर आपने अपना समय इसके साथ सिंक करें Google एनटीपी.

invalid_grant Invalid JWT Signature.

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

वैकल्पिक रूप से, JWT के दावे को गलत ढंग से एन्कोड किया जा सकता है - यह Base64-एन्कोड किया गया, जिसमें न्यूलाइन या पैडिंग के बराबर चिह्न नहीं हैं.

JWT दावा सेट को डिकोड करें और उस कुंजी को सत्यापित करें जिसने दावे पर हस्ताक्षर किया है डालें.

यह पक्का करने के लिए कि JWT सही तरीके से जनरेट हुआ है, Google की OAuth लाइब्रेरी का इस्तेमाल करें.

invalid_scope Invalid OAuth scope or ID token audience provided. किसी स्कोप का अनुरोध नहीं किया गया (स्कोप की खाली सूची) या अनुरोध किए गए किसी स्कोप का अनुरोध नहीं किया गया मौजूद है (यानी अमान्य है).

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

ध्यान दें कि scope दावे में दायरों की सूची को इससे अलग किया जाना चाहिए खाली जगह छोड़ें, कॉमा नहीं.

disabled_client The OAuth client was disabled. JWT के दावे पर हस्ताक्षर करने के लिए इस्तेमाल की जाने वाली कुंजी बंद है.

Google API Consoleपर जाएं और IAM और एडमिन की जानकारी > सेवा खाते, वह सेवा खाता चालू करें जिसमें "कुंजी आईडी" शामिल हो इस्तेमाल किया गया दावे पर हस्ताक्षर करने के लिए.

org_internal This client is restricted to users within its organization. अनुरोध में दिया गया OAuth क्लाइंट आईडी, Google के ऐक्सेस को सीमित करने वाले प्रोजेक्ट का हिस्सा है किसी खास दायरे में मौजूद खाते Google Cloud का संगठन.

पुष्टि करने के लिए, संगठन के सेवा खाते का इस्तेमाल करें. पुष्टि करें उपयोगकर्ता टाइप कॉन्फ़िगरेशन पर निर्भर करता है.

शर्तें: OAuth के बिना सेवा खाते की अनुमति देना

कुछ Google API के साथ, साइन किए गए JWT का इस्तेमाल करके, सीधे मुहैया कराने के लिए, OAuth 2.0 ऐक्सेस टोकन के बजाय बियरर टोकन का इस्तेमाल किया जा सकता है. जब ऐसा करना मुमकिन होता है, तो आपके पास एपीआई कॉल करने से पहले, Google के ऑथराइज़ेशन सर्वर पर नेटवर्क अनुरोध करें.

जिस एपीआई को कॉल करना है, अगर उसकी सेवा की परिभाषा GitHub रिपॉज़िटरी के लिए Google API, तो किसी ऐक्सेस टोकन के बजाय, JWT का इस्तेमाल करके, अनुमति वाले एपीआई कॉल किए जा सकते हैं. इसके लिए:

  1. ऊपर बताए गए तरीके से, सेवा खाता बनाएं. कृपया आपको जो JSON फ़ाइल मिलेगी वह आपको खाता बनाते समय ही मिलेगी.
  2. किसी मानक JWT लाइब्रेरी का उपयोग करना, जैसा कि jwt.io, हेडर के साथ JWT बनाएं और पेलोड का उदाहरण नीचे दिया गया है:
    {
      "alg": "RS256",
      "typ": "JWT",
      "kid": "abcdef1234567890"
    }
    .
    {
      "iss": "123456-compute@developer.gserviceaccount.com",
      "sub": "123456-compute@developer.gserviceaccount.com",
      "aud": "https://firestore.googleapis.com/",
      "iat": 1511900000,
      "exp": 1511903600
    }
    • हेडर में kid फ़ील्ड के लिए, अपने सेवा खाते की निजी कुंजी बताएं आईडी. आपको यह वैल्यू, अपने सेवा खाते के private_key_id फ़ील्ड में दिखेगी JSON फ़ाइल.
    • iss और sub फ़ील्ड के लिए, अपने सेवा खाते का ईमेल पता बताएं इससे पहले ही अपने कारोबार के हिसाब से name@yourcompany.com जैसा कोई ईमेल पता बनाएं. आपको यह वैल्यू, अपनी सेवा के client_email फ़ील्ड में मिलेगी खाते की JSON फ़ाइल.
    • aud फ़ील्ड के लिए, एपीआई एंडपॉइंट की जानकारी दें. जैसे: https://SERVICE.googleapis.com/.
    • iat फ़ील्ड के लिए, मौजूदा यूनिक्स समय की जानकारी दें और exp फ़ील्ड में, सटीक समय 3600 सेकंड बाद तय करें, जब JWT की समयसीमा खत्म होने वाली है.

अपने सेवा खाते की JSON फ़ाइल में मिली निजी कुंजी का इस्तेमाल करके, आरएसए-256 के साथ जेडब्ल्यूटी को साइन करें.

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

Java

इसका इस्तेमाल किया जा रहा है google-api-java-client और java-jwt:

GoogleCredential credential =
        GoogleCredential.fromStream(new FileInputStream("MyProject-1234.json"));
PrivateKey privateKey = credential.getServiceAccountPrivateKey();
String privateKeyId = credential.getServiceAccountPrivateKeyId();

long now = System.currentTimeMillis();

try {
    Algorithm algorithm = Algorithm.RSA256(null, privateKey);
    String signedJwt = JWT.create()
        .withKeyId(privateKeyId)
        .withIssuer("123456-compute@developer.gserviceaccount.com")
        .withSubject("123456-compute@developer.gserviceaccount.com")
        .withAudience("https://firestore.googleapis.com/")
        .withIssuedAt(new Date(now))
        .withExpiresAt(new Date(now + 3600 * 1000L))
        .sign(algorithm);
} catch ...

Python

PyJWT का इस्तेमाल करके:

iat = time.time()
exp = iat + 3600
payload = {'iss': '123456-compute@developer.gserviceaccount.com',
           'sub': '123456-compute@developer.gserviceaccount.com',
           'aud': 'https://firestore.googleapis.com/',
           'iat': iat,
           'exp': exp}
additional_headers = {'kid': PRIVATE_KEY_ID_FROM_JSON}
signed_jwt = jwt.encode(payload, PRIVATE_KEY_FROM_JSON, headers=additional_headers,
                       algorithm='RS256')
  1. साइन किए गए JWT का बियरर टोकन के तौर पर इस्तेमाल करके, एपीआई को कॉल करें:
    GET /v1/projects/abc/databases/123/indexes HTTP/1.1
    Authorization: Bearer SIGNED_JWT
    Host: firestore.googleapis.com
    अभी तक किसी भी व्यक्ति ने चेक इन नहीं किया है

'सभी खातों की सुरक्षा' सुविधा को लागू करना

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

Google की 'सभी खातों की सुरक्षा' सेवा से आपके ऐप्लिकेशन को भेजे जाने वाले इवेंट टाइप के कुछ उदाहरण:

  • https://schemas.openid.net/secevent/risc/event-type/sessions-revoked
  • https://schemas.openid.net/secevent/oauth/event-type/token-revoked
  • https://schemas.openid.net/secevent/risc/event-type/account-disabled

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