अपने सर्वर साइड पर Google आईडी टोकन की पुष्टि करें

जब Google किसी आईडी टोकन को दिखाता है, तो उसे आपके लॉगिन एंडपॉइंट पर, एचटीटीपी POST तरीके वाले अनुरोध के ज़रिए सबमिट किया जाता है. इस अनुरोध में पैरामीटर का नाम credential होता है.

Python भाषा में, नीचे एक उदाहरण दिया गया है. इसमें आईडी टोकन की पुष्टि करने और उसका इस्तेमाल करने के सामान्य तरीके बताए गए हैं:

  1. क्रॉस-साइट अनुरोध से जुड़ी जालसाज़ी (सीएसआरएफ़) टोकन की पुष्टि करें. जब लॉगिन एंडपॉइंट पर क्रेडेंशियल सबमिट किए जाते हैं, तो हम सीएसआरएफ़ हमलों से बचने के लिए डबल-सबमिट-कुकी पैटर्न का इस्तेमाल करते हैं. हर सबमिशन से पहले, हम एक टोकन जनरेट करते हैं. इसके बाद, टोकन को कुकी और पोस्ट के मुख्य हिस्से, दोनों में डाल दिया जाता है, जैसा कि नीचे दिए गए कोड के उदाहरण में दिखाया गया है:

    csrf_token_cookie = self.request.cookies.get('g_csrf_token')
    if not csrf_token_cookie:
        webapp2.abort(400, 'No CSRF token in Cookie.')
    csrf_token_body = self.request.get('g_csrf_token')
    if not csrf_token_body:
        webapp2.abort(400, 'No CSRF token in post body.')
    if csrf_token_cookie != csrf_token_body:
        webapp2.abort(400, 'Failed to verify double submit cookie.')
    
  2. आईडी टोकन की पुष्टि करें.

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

    • Google ने आईडी टोकन पर सही तरीके से हस्ताक्षर किया है. टोकन के हस्ताक्षर की पुष्टि करने के लिए, Google की सार्वजनिक कुंजियों (JWK या PEM फ़ॉर्मैट में उपलब्ध) का इस्तेमाल करें. इन कुंजियों को नियमित तौर पर घुमाया जाता है. जवाब में Cache-Control हेडर की जांच करके, यह तय करें कि आपको उन्हें फिर से कब वापस पाना चाहिए.
    • आईडी टोकन में aud की वैल्यू आपके ऐप्लिकेशन के किसी क्लाइंट आईडी के बराबर है. यह जांच इसलिए ज़रूरी है, ताकि किसी नुकसान पहुंचाने वाले ऐप्लिकेशन को जारी किए गए आईडी टोकन, आपके ऐप्लिकेशन के बैकएंड सर्वर पर, उसी उपयोगकर्ता का डेटा ऐक्सेस करने के लिए इस्तेमाल न किए जा सकें.
    • आईडी टोकन में iss की वैल्यू accounts.google.com या https://accounts.google.com के बराबर है.
    • आईडी टोकन की समयसीमा (exp) खत्म नहीं हुई है.
    • अगर आपको इस बात की पुष्टि करनी है कि आईडी टोकन, Google Workspace या Cloud संगठन के खाते के बारे में बताता है, तो hd दावा देखें. इससे पता चलता है कि उपयोगकर्ता का होस्ट किया गया डोमेन क्या है. किसी संसाधन के ऐक्सेस को सिर्फ़ कुछ डोमेन के सदस्यों को सीमित करते समय इसका इस्तेमाल करना चाहिए. यह दावा मौजूद न होने का मतलब है कि यह खाता, Google के होस्ट किए गए डोमेन से नहीं जुड़ा है.

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

    Google API क्लाइंट लाइब्रेरी का इस्तेमाल करना

    प्रोडक्शन एनवायरमेंट में, Google आईडी टोकन की पुष्टि करने के लिए, Google API क्लाइंट लाइब्रेरी में से किसी एक का इस्तेमाल करने का सुझाव दिया जाता है. जैसे, Java, Node.js, PHP, Python.

    JavaScript

    Java में किसी आईडी टोकन की पुष्टि करने के लिए, GoogleIdTokenVerifier ऑब्जेक्ट का इस्तेमाल करें. उदाहरण के लिए:

    import com.google.api.client.googleapis.auth.oauth2.GoogleIdToken;
    import com.google.api.client.googleapis.auth.oauth2.GoogleIdToken.Payload;
    import com.google.api.client.googleapis.auth.oauth2.GoogleIdTokenVerifier;
    
    ...
    
    GoogleIdTokenVerifier verifier = new GoogleIdTokenVerifier.Builder(transport, jsonFactory)
        // Specify the CLIENT_ID of the app that accesses the backend:
        .setAudience(Collections.singletonList(CLIENT_ID))
        // Or, if multiple clients access the backend:
        //.setAudience(Arrays.asList(CLIENT_ID_1, CLIENT_ID_2, CLIENT_ID_3))
        .build();
    
    // (Receive idTokenString by HTTPS POST)
    
    GoogleIdToken idToken = verifier.verify(idTokenString);
    if (idToken != null) {
      Payload payload = idToken.getPayload();
    
      // Print user identifier
      String userId = payload.getSubject();
      System.out.println("User ID: " + userId);
    
      // Get profile information from payload
      String email = payload.getEmail();
      boolean emailVerified = Boolean.valueOf(payload.getEmailVerified());
      String name = (String) payload.get("name");
      String pictureUrl = (String) payload.get("picture");
      String locale = (String) payload.get("locale");
      String familyName = (String) payload.get("family_name");
      String givenName = (String) payload.get("given_name");
    
      // Use or store profile information
      // ...
    
    } else {
      System.out.println("Invalid ID token.");
    }

    GoogleIdTokenVerifier.verify() का इस्तेमाल, JWT के हस्ताक्षर, aud दावे, iss दावे, और exp दावे की पुष्टि करता है.

    अगर आपको यह पुष्टि करनी है कि आईडी टोकन, Google Workspace या Cloud संगठन के खाते से जुड़ा है, तो hd दावे की पुष्टि करें. इसके लिए, Payload.getHostedDomain() तरीके से लौटाए गए डोमेन नेम की जांच करें. email दावे वाले डोमेन की वजह से, यह पक्का नहीं किया जा सकता कि खाते को किसी डोमेन या संगठन से मैनेज किया जा रहा है या नहीं.

    Node.js

    Node.js में किसी आईडी टोकन की पुष्टि करने के लिए, Node.js के लिए Google Auth लाइब्रेरी का इस्तेमाल करें. लाइब्रेरी इंस्टॉल करें:

    npm install google-auth-library --save
    इसके बाद, verifyIdToken() फ़ंक्शन को कॉल करें. उदाहरण के लिए:

    const {OAuth2Client} = require('google-auth-library');
    const client = new OAuth2Client();
    async function verify() {
      const ticket = await client.verifyIdToken({
          idToken: token,
          audience: CLIENT_ID,  // Specify the CLIENT_ID of the app that accesses the backend
          // Or, if multiple clients access the backend:
          //[CLIENT_ID_1, CLIENT_ID_2, CLIENT_ID_3]
      });
      const payload = ticket.getPayload();
      const userid = payload['sub'];
      // If request specified a G Suite domain:
      // const domain = payload['hd'];
    }
    verify().catch(console.error);
    

    verifyIdToken फ़ंक्शन, JWT हस्ताक्षर, aud दावे, exp दावे, और iss दावे की पुष्टि करता है.

    अगर आपको इस बात की पुष्टि करनी है कि आईडी टोकन, Google Workspace या Cloud संगठन के खाते के बारे में बताता है, तो hd दावा देखें. इससे पता चलता है कि उपयोगकर्ता का होस्ट किया गया डोमेन क्या है. किसी संसाधन के ऐक्सेस को सिर्फ़ कुछ डोमेन के सदस्यों तक सीमित करते समय, इसका इस्तेमाल करना चाहिए. इस दावे के न होने का मतलब है कि यह खाता, Google के होस्ट किए गए डोमेन से नहीं जुड़ा है.

    फ़िलिपींस

    PHP में किसी आईडी टोकन की पुष्टि करने के लिए, PHP के लिए Google एपीआई क्लाइंट लाइब्रेरी का इस्तेमाल करें. लाइब्रेरी इंस्टॉल करें (उदाहरण के लिए, कंपोज़र का इस्तेमाल करके):

    composer require google/apiclient
    इसके बाद, verifyIdToken() फ़ंक्शन को कॉल करें. उदाहरण के लिए:

    require_once 'vendor/autoload.php';
    
    // Get $id_token via HTTPS POST.
    
    $client = new Google_Client(['client_id' => $CLIENT_ID]);  // Specify the CLIENT_ID of the app that accesses the backend
    $payload = $client->verifyIdToken($id_token);
    if ($payload) {
      $userid = $payload['sub'];
      // If request specified a G Suite domain:
      //$domain = $payload['hd'];
    } else {
      // Invalid ID token
    }
    

    verifyIdToken फ़ंक्शन, JWT हस्ताक्षर, aud दावे, exp दावे, और iss दावे की पुष्टि करता है.

    अगर आपको इस बात की पुष्टि करनी है कि आईडी टोकन, Google Workspace या Cloud संगठन के खाते के बारे में बताता है, तो hd दावा देखें. इससे पता चलता है कि उपयोगकर्ता का होस्ट किया गया डोमेन क्या है. किसी संसाधन के ऐक्सेस को सिर्फ़ कुछ डोमेन के सदस्यों तक सीमित करते समय, इसका इस्तेमाल करना चाहिए. इस दावे के न होने का मतलब है कि यह खाता, Google के होस्ट किए गए डोमेन से नहीं जुड़ा है.

    Python

    Python में किसी आईडी टोकन की पुष्टि करने के लिए, verify_oauth2_token फ़ंक्शन का इस्तेमाल करें. उदाहरण के लिए:

    from google.oauth2 import id_token
    from google.auth.transport import requests
    
    # (Receive token by HTTPS POST)
    # ...
    
    try:
        # Specify the CLIENT_ID of the app that accesses the backend:
        idinfo = id_token.verify_oauth2_token(token, requests.Request(), CLIENT_ID)
    
        # Or, if multiple clients access the backend server:
        # idinfo = id_token.verify_oauth2_token(token, requests.Request())
        # if idinfo['aud'] not in [CLIENT_ID_1, CLIENT_ID_2, CLIENT_ID_3]:
        #     raise ValueError('Could not verify audience.')
    
        # If auth request is from a G Suite domain:
        # if idinfo['hd'] != GSUITE_DOMAIN_NAME:
        #     raise ValueError('Wrong hosted domain.')
    
        # ID token is valid. Get the user's Google Account ID from the decoded token.
        userid = idinfo['sub']
    except ValueError:
        # Invalid token
        pass
    

    verify_oauth2_token फ़ंक्शन, JWT के हस्ताक्षर, aud दावे, और exp दावे की पुष्टि करता है. आपको hd दावे (अगर लागू हो) की पुष्टि भी करनी होगी. इसके लिए, verify_oauth2_token से मिले ऑब्जेक्ट की जांच करें. अगर एक से ज़्यादा क्लाइंट बैकएंड सर्वर को ऐक्सेस करते हैं, तो aud के दावे की मैन्युअल तरीके से भी पुष्टि करें.

  3. टोकन के मान्य होने की पुष्टि होने के बाद, अपनी साइट के खाते की स्थिति देखने के लिए, Google आईडी टोकन में दी गई जानकारी का इस्तेमाल किया जा सकता है:

    • रजिस्ट्रेशन रद्द किया गया उपयोगकर्ता: साइन-अप यूज़र इंटरफ़ेस (यूआई) दिखाया जा सकता है. इसकी मदद से, उपयोगकर्ता ज़रूरत पड़ने पर, प्रोफ़ाइल की ज़्यादा जानकारी दे सकता है. इससे उपयोगकर्ता भी चुपचाप नया खाता बना सकता है और लॉग इन किया गया उपयोगकर्ता सेशन भी बना सकता है.

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

    • लौटने वाला फ़ेडरेटेड उपयोगकर्ता: आपके पास उपयोगकर्ता को चुपचाप साइन इन करने की सुविधा देने का विकल्प होता है.