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