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

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

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

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