אחרי שמאחזרים את פרטי הכניסה של המשתמש או מאחזרים רמזים לכניסה, אפשר לבדוק אם יש אסימון מזהה לפרטי הכניסה. אסימון מזהה הוא הצהרה חתומה לגבי זהות המשתמש, והוא מכיל גם את פרטי הפרופיל הבסיסיים של המשתמש, כולל כתובת אימייל שאומתה על ידי Google. כשזמינים אסימוני זיהוי, אפשר להשתמש בהם כדי לבצע אימות מאובטח עם הקצה העורפי של האפליקציה, או כדי לדלג על שלב אימות האימייל כשיוצרים חשבון חדש.
טוקן מזהה זמין כשמזהה המשתמש של אובייקט Credential
תואם למזהה המשתמש של חשבון Google שמחובר למכשיר.
כדי להיכנס באמצעות אסימון מזהה, קודם צריך לאחזר את אסימון המזהה באמצעות השיטה getIdTokens
. לאחר מכן, שולחים את אסימון הזהות לחלק האחורי של האפליקציה. בצד השרת, מאמתים את האסימון באמצעות ספריית לקוח של Google API או ספריית JWT לשימוש כללי.
לפני שמתחילים
- האפליקציה צריכה להיות מסוגלת לאחזר את פרטי הכניסה של המשתמש או לאחזר רמז לכניסה.
- צריך לבצע קריאה ל-
setAccountTypes(IdentityProviders.GOOGLE)
כשיוצרים את האובייקטיםCredentialRequest
ו-HintRequest
.
קבלת אסימון מזהה מאובייקט פרטי הכניסה
אחרי שמקבלים את פרטי הכניסה של המשתמש, בודקים אם האובייקט 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.