หลังจากดึงข้อมูลเข้าสู่ระบบของผู้ใช้ หรือดึงคำแนะนำในการลงชื่อเข้าใช้ เรียบร้อยแล้ว คุณจะตรวจสอบได้ว่ามีโทเค็นรหัสสำหรับข้อมูลเข้าสู่ระบบหรือไม่ โทเค็นรหัสคือ การยืนยันที่ลงนามในตัวตนของผู้ใช้ ซึ่งมีข้อมูลโปรไฟล์พื้นฐาน ของผู้ใช้ด้วย และอาจรวมถึงอีเมลที่ Google ยืนยันแล้ว เมื่อมีโทเค็นรหัส คุณจะใช้โทเค็นดังกล่าวเพื่อตรวจสอบสิทธิ์กับแบ็กเอนด์ของแอปได้อย่างปลอดภัย หรือข้ามขั้นตอนการยืนยันอีเมล เมื่อสร้างบัญชีใหม่ได้
โทเค็นรหัสจะพร้อมใช้งานเมื่อรหัสผู้ใช้ของออบเจ็กต์ Credential
ตรงกับรหัสผู้ใช้ของบัญชี Google ที่ลงชื่อเข้าใช้อุปกรณ์
หากต้องการลงชื่อเข้าใช้ด้วยโทเค็นรหัส ให้เรียกข้อมูลโทเค็นรหัสด้วยเมธอด getIdTokens
ก่อน จากนั้นส่งโทเค็นรหัสไปยังแบ็กเอนด์ของแอป ในแบ็กเอนด์ ให้ยืนยันโทเค็นโดยใช้ไลบรารีของไคลเอ็นต์ Google API หรือไลบรารี JWT แบบอเนกประสงค์
ก่อนเริ่มต้น
- แอปของคุณต้องดึงข้อมูลเข้าสู่ระบบของผู้ใช้ หรือดึงคำใบ้ในการลงชื่อเข้าใช้ได้สำเร็จ
- คุณต้องเรียกใช้
setAccountTypes(IdentityProviders.GOOGLE)
เมื่อสร้างออบเจ็กต์CredentialRequest
และHintRequest
รับโทเค็นรหัสจากออบเจ็กต์ข้อมูลเข้าสู่ระบบ
หลังจากดึงข้อมูลเข้าสู่ระบบของผู้ใช้แล้ว ให้ตรวจสอบว่าออบเจ็กต์ 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 สำหรับ 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