หลังจากที่ดึงข้อมูลเข้าสู่ระบบของผู้ใช้หรือดึงข้อมูลคำแนะนำในการลงชื่อเข้าใช้สำเร็จแล้ว คุณจะตรวจสอบได้ว่าโทเค็นรหัสใช้กับข้อมูลเข้าสู่ระบบได้หรือไม่ โทเค็นรหัสคือการยืนยันตัวตนของผู้ใช้ที่มีการลงนามและมีข้อมูลโปรไฟล์พื้นฐานของผู้ใช้ ซึ่งอาจรวมถึงที่อยู่อีเมลที่ 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 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 Sign-In