אפשר להיכנס באמצעות אסימונים מזהים

אחרי שמאחזרים את פרטי הכניסה של המשתמש או מאחזרים רמזים לכניסה, אפשר לבדוק אם יש אסימון מזהה לפרטי הכניסה. אסימון מזהה הוא הצהרה חתומה לגבי זהות המשתמש, והוא מכיל גם את פרטי הפרופיל הבסיסיים של המשתמש, כולל כתובת אימייל שאומתה על ידי Google. כשזמינים אסימוני זיהוי, אפשר להשתמש בהם כדי לבצע אימות מאובטח עם הקצה העורפי של האפליקציה, או כדי לדלג על שלב אימות האימייל כשיוצרים חשבון חדש.

טוקן מזהה זמין כשמזהה המשתמש של אובייקט Credential תואם למזהה המשתמש של חשבון Google שמחובר למכשיר.

כדי להיכנס באמצעות אסימון מזהה, קודם צריך לאחזר את אסימון המזהה באמצעות השיטה getIdTokens. לאחר מכן, שולחים את אסימון הזהות לחלק האחורי של האפליקציה. בצד השרת, מאמתים את האסימון באמצעות ספריית לקוח של Google API או ספריית JWT לשימוש כללי.

לפני שמתחילים

קבלת אסימון מזהה מאובייקט פרטי הכניסה

אחרי שמקבלים את פרטי הכניסה של המשתמש, בודקים אם האובייקט Credentials כולל אסימון מזהה. אם כן, צריך להתקשר אל getIdTokens כדי לאחזר אותו ולשלוח אותו אל ה-backend באמצעות HTTPS 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);
    }
}

אימות האסימון המזהה בקצה העורפי

אחרי שמקבלים את אסימון ה-ID באמצעות HTTPS POST, צריך לאמת את החתימה של האסימון ואת הטענות aud, iss ו-exp של האסימון.

ההצהרה aud של אסימון מזהה מ-Smart Lock לסיסמאות היא בפורמט הבא:

android://SHA512_HASH@ANDROID_PACKAGE_NAME

הערך SHA512HASH הוא גיבוב (hash) SHA-512 של אישור החתימה. אפשר לקבל את הערך הזה באמצעות כלי השירות keytool ו-openssl:

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

אפשרות נוספת היא לבדוק אסימון מזהה שאתם יודעים שהוא תקף כדי לקבל את גיבוב SHA-512.

ספריות JWT יכולות לטפל בחלק ממשימות האימות האלה בשבילכם. לדוגמה, באמצעות Google Auth Library עבור Java:

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.