आईडी टोकन का इस्तेमाल करके साइन इन करें

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

आईडी टोकन तब उपलब्ध होता है, जब Credential ऑब्जेक्ट का यूज़र आईडी, डिवाइस पर साइन इन किए गए Google खाते के यूज़र आईडी से मेल खाता हो.

आईडी टोकन से साइन इन करने के लिए, सबसे पहले getIdTokens तरीके से आईडी टोकन पाएं. इसके बाद, आईडी टोकन को अपने ऐप्लिकेशन के बैकएंड पर भेजें. बैकएंड पर, Google API की क्लाइंट लाइब्रेरी या सामान्य मकसद के लिए इस्तेमाल होने वाली JWT लाइब्रेरी का इस्तेमाल करके, टोकन की पुष्टि करें.

शुरू करने से पहले

क्रेडेंशियल ऑब्जेक्ट से आईडी टोकन पाना

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

if (!credential.getIdTokens().isEmpty()) {
    String idToken = credential.getIdTokens().get(0).getIdToken();

    HttpClient httpClient = new DefaultHttpClient();
    HttpPost httpPost = new HttpPost("https://yourbackend.example.com/tokensignin");

    try {
        List nameValuePairs = new ArrayList(1);
        nameValuePairs.add(new BasicNameValuePair("idToken", idToken));
        httpPost.setEntity(new UrlEncodedFormEntity(nameValuePairs));

        HttpResponse response = httpClient.execute(httpPost);
        int statusCode = response.getStatusLine().getStatusCode();
        final String responseBody = EntityUtils.toString(response.getEntity());
        Log.i(TAG, "Signed in as: " + responseBody);
    }
}

बैकएंड पर आईडी टोकन की पुष्टि करना

एचटीटीपीएस पोस्ट के ज़रिए आईडी टोकन मिलने के बाद, आपको टोकन के हस्ताक्षर की पुष्टि करनी होगी. साथ ही, टोकन के aud, iss, और exp दावों की पुष्टि करनी होगी.

पासवर्ड के लिए Smart Lock से मिले आईडी टोकन के aud दावे का फ़ॉर्मैट यहां दिया गया है:

android://SHA512_HASH@ANDROID_PACKAGE_NAME

SHA512HASH वैल्यू, आपके साइनिंग सर्टिफ़िकेट का SHA-512 हैश है. keytool और openssl यूटिलिटी का इस्तेमाल करके, यह वैल्यू पाई जा सकती है:

keytool -exportcert -keystore path-to-keystore -alias key-name 
| openssl sha -sha512 -binary
| base64 -w 0
| tr '+/' '-
'

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

JWT लाइब्रेरी, पुष्टि करने से जुड़े कुछ टास्क आपके लिए मैनेज कर सकती हैं. उदाहरण के लिए, Java के लिए Google Auth Library का इस्तेमाल करके:

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;

...

// Verifier that checks that the token has the proper issuer and audience,
// and hasn't expired
private static GoogleIdTokenVerifier verifier =
    new GoogleIdTokenVerifier.Builder(transport, jsonFactory)
        .setAudience(Arrays.asList(String.format("android://%s@%s", SHA512_HASH, PACKAGE_NAME)))
        .build();

// (Receive idTokenString by HTTPS POST)

GoogleIdToken idToken = verifier.verify(idTokenString);
if (idToken != null) {
  Payload payload = idToken.getPayload();
  System.out.println("User email: " + payload.getEmail());
  if (payload.getEmailVerified()) {
    System.out.println("Email verified by Google.");
  }
} else {
  System.out.println("Invalid ID token.");
}

ज़्यादा जानकारी के लिए, Google साइन-इन से जुड़ा दस्तावेज़ देखें.