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