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

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

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

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

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

קבלת אסימון מזהה מהאובייקט Credentials

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

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

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

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

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 יכולות לטפל עבורכם בחלק ממשימות האימות האלה. לדוגמה, באמצעות ספריית הלקוח של Google API עבור 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 לפרטים נוספים.