ลงชื่อเข้าใช้โดยใช้โทเค็นรหัส

หลังจากดึงข้อมูลเข้าสู่ระบบของผู้ใช้ หรือดึงคำแนะนำในการลงชื่อเข้าใช้ เรียบร้อยแล้ว คุณจะตรวจสอบได้ว่ามีโทเค็นรหัสสำหรับข้อมูลเข้าสู่ระบบหรือไม่ โทเค็นรหัสคือ การยืนยันที่ลงนามในตัวตนของผู้ใช้ ซึ่งมีข้อมูลโปรไฟล์พื้นฐาน ของผู้ใช้ด้วย และอาจรวมถึงอีเมลที่ Google ยืนยันแล้ว เมื่อมีโทเค็นรหัส คุณจะใช้โทเค็นดังกล่าวเพื่อตรวจสอบสิทธิ์กับแบ็กเอนด์ของแอปได้อย่างปลอดภัย หรือข้ามขั้นตอนการยืนยันอีเมล เมื่อสร้างบัญชีใหม่ได้

โทเค็นรหัสจะพร้อมใช้งานเมื่อรหัสผู้ใช้ของออบเจ็กต์ Credential ตรงกับรหัสผู้ใช้ของบัญชี Google ที่ลงชื่อเข้าใช้อุปกรณ์

หากต้องการลงชื่อเข้าใช้ด้วยโทเค็นรหัส ให้เรียกข้อมูลโทเค็นรหัสด้วยเมธอด getIdTokens ก่อน จากนั้นส่งโทเค็นรหัสไปยังแบ็กเอนด์ของแอป ในแบ็กเอนด์ ให้ยืนยันโทเค็นโดยใช้ไลบรารีของไคลเอ็นต์ Google API หรือไลบรารี JWT แบบอเนกประสงค์

ก่อนเริ่มต้น

รับโทเค็นรหัสจากออบเจ็กต์ข้อมูลเข้าสู่ระบบ

หลังจากดึงข้อมูลเข้าสู่ระบบของผู้ใช้แล้ว ให้ตรวจสอบว่าออบเจ็กต์ 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