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

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