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

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

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

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

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

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

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

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);
    }
}

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

एचटीटीपीएस POST से आईडी टोकन मिलने के बाद, आपको टोकन के हस्ताक्षर की पुष्टि करनी होगी. साथ ही, टोकन के 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 API क्लाइंट लाइब्रेरी का इस्तेमाल करके:

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 साइन इन का दस्तावेज़ देखें.