การลงชื่อเข้าใช้บัญชีที่ลิงก์จะเปิดใช้การลงชื่อเข้าใช้ด้วย Google ด้วยการแตะเพียงครั้งเดียวสำหรับผู้ใช้ที่ลิงก์บัญชี Google กับบริการของคุณอยู่แล้ว ซึ่งจะช่วยปรับปรุงประสบการณ์ของผู้ใช้เนื่องจากสามารถลงชื่อเข้าใช้ได้ด้วยการคลิกเพียงครั้งเดียว โดยไม่ต้องป้อนชื่อผู้ใช้และรหัสผ่านอีกครั้ง นอกจากนี้ยังช่วยลดโอกาสที่ผู้ใช้จะสร้างบัญชีซ้ำในบริการของคุณด้วย
การลงชื่อเข้าใช้บัญชีที่ลิงก์เป็นส่วนหนึ่งของขั้นตอนการลงชื่อเข้าใช้ด้วย One Tap สำหรับ Android ซึ่งหมายความว่าคุณไม่จำเป็นต้องนำเข้าไลบรารีแยกต่างหากหากแอปเปิดใช้ฟีเจอร์ One Tap อยู่แล้ว
ในเอกสารนี้ คุณจะได้เรียนรู้วิธีแก้ไขแอป Android เพื่อรองรับการลงชื่อเข้าใช้บัญชีที่ลิงก์
วิธีการทำงาน
- คุณเลือกใช้เพื่อแสดงบัญชีที่ลิงก์ในระหว่างขั้นตอนการลงชื่อเข้าใช้ด้วย One Tap
- หากผู้ใช้ลงชื่อเข้าใช้ Google และลิงก์บัญชี Google กับบัญชีในบริการของคุณ ระบบจะแสดงผลโทเค็นระบุตัวตนสำหรับบัญชีที่ลิงก์
- ผู้ใช้จะเห็นข้อความแจ้งให้ลงชื่อเข้าใช้ด้วย One Tap พร้อมตัวเลือกในการลงชื่อเข้าใช้บริการของคุณด้วยบัญชีที่ลิงก์
- หากผู้ใช้เลือกที่จะดำเนินการต่อด้วยบัญชีที่ลิงก์ ระบบจะแสดงผลโทเค็นระบุตัวตนของผู้ใช้ไปยังแอปของคุณ คุณจับคู่โทเค็นนี้กับโทเค็นที่ส่งไปยังเซิร์ฟเวอร์ในขั้นตอนที่ 2 เพื่อระบุผู้ใช้ที่เข้าสู่ระบบ
ตั้งค่า
หากต้องการตั้งค่าการลงชื่อเข้าใช้บัญชีที่ลิงก์ ให้กำหนดค่าสภาพแวดล้อมในการพัฒนาซอฟต์แวร์และแอปของคุณ
ตั้งค่าสภาพแวดล้อมในการพัฒนาซอฟต์แวร์
ดาวน์โหลดบริการ Google Play เวอร์ชันล่าสุดในโฮสต์การพัฒนาของคุณโดยทำดังนี้
ในส่วน SDK Tools ให้ค้นหาบริการ Google Play
หากสถานะของแพ็กเกจเหล่านี้ไม่ใช่ "ติดตั้งแล้ว" ให้เลือกทั้ง 2 แพ็กเกจ แล้วคลิกติดตั้งแพ็กเกจ
กำหนดค่าแอป
ในไฟล์
build.gradleระดับโปรเจ็กต์ ให้รวมที่เก็บ Maven ของ Google ไว้ในทั้งส่วนbuildscriptและallprojectsbuildscript { repositories { google() } } allprojects { repositories { google() } }เพิ่มทรัพยากร Dependency สำหรับ API "ลิงก์กับ Google" ลงในไฟล์ Gradle ระดับแอปของโมดูล ซึ่งโดยปกติจะเป็น
app/build.gradledependencies { implementation 'com.google.android.gms:play-services-auth:21.3.0' }
แก้ไขแอป Android เพื่อรองรับการลงชื่อเข้าใช้บัญชีที่ลิงก์
เมื่อสิ้นสุดขั้นตอนการลงชื่อเข้าใช้บัญชีที่ลิงก์ ระบบจะแสดงผลโทเค็นระบุตัวตนกลับไปยังแอปของคุณ คุณควรยืนยันความสมบูรณ์ของโทเค็นระบุตัวตนก่อนลงชื่อเข้าใช้ให้ผู้ใช้
ตัวอย่างโค้ดต่อไปนี้แสดงรายละเอียดขั้นตอนในการดึงข้อมูล ยืนยันโทเค็นระบุตัวตน และลงชื่อเข้าใช้ให้ผู้ใช้ในภายหลัง
สร้างกิจกรรมเพื่อรับผลลัพธ์ของ Intent การลงชื่อเข้าใช้
Kotlin
private val activityResultLauncher = registerForActivityResult( ActivityResultContracts.StartIntentSenderForResult()) { result -> if (result.resultCode == RESULT_OK) { try { val signInCredentials = Identity.signInClient(this) .signInCredentialFromIntent(result.data) // Review the Verify the integrity of the ID token section for // details on how to verify the ID token verifyIdToken(signInCredential.googleIdToken) } catch (e: ApiException) { Log.e(TAG, "Sign-in failed with error code:", e) } } else { Log.e(TAG, "Sign-in failed") } }Java
private final ActivityResultLauncher<IntentSenderResult> activityResultLauncher = registerForActivityResult( new ActivityResultContracts.StartIntentSenderForResult(), result -> { If (result.getResultCode() == RESULT_OK) { try { SignInCredential signInCredential = Identity.getSignInClient(this) .getSignInCredentialFromIntent(result.getData()); verifyIdToken(signInCredential.getGoogleIdToken()); } catch (e: ApiException ) { Log.e(TAG, "Sign-in failed with error:", e) } } else { Log.e(TAG, "Sign-in failed") } });สร้างคำขอลงชื่อเข้าใช้
Kotlin
private val tokenRequestOptions = GoogleIdTokenRequestOptions.Builder() .supported(true) // Your server's client ID, not your Android client ID. .serverClientId(getString("your-server-client-id") .filterByAuthorizedAccounts(true) .associateLinkedAccounts("service-id-of-and-defined-by-developer", scopes) .build()Java
private final GoogleIdTokenRequestOptions tokenRequestOptions = GoogleIdTokenRequestOptions.Builder() .setSupported(true) .setServerClientId("your-service-client-id") .setFilterByAuthorizedAccounts(true) .associateLinkedAccounts("service-id-of-and-defined-by-developer", scopes) .build()เปิด Intent รอดำเนินการของการลงชื่อเข้าใช้
Kotlin
Identity.signInClient(this) .beginSignIn( BeginSignInRequest.Builder() .googleIdTokenRequestOptions(tokenRequestOptions) .build()) .addOnSuccessListener{result -> activityResultLauncher.launch(result.pendingIntent.intentSender) } .addOnFailureListener {e -> Log.e(TAG, "Sign-in failed because:", e) }Java
Identity.getSignInClient(this) .beginSignIn( BeginSignInRequest.Builder() .setGoogleIdTokenRequestOptions(tokenRequestOptions) .build()) .addOnSuccessListener(result -> { activityResultLauncher.launch( result.getPendingIntent().getIntentSender()); }) .addOnFailureListener(e -> { Log.e(TAG, "Sign-in failed because:", e); });
ยืนยันความสมบูรณ์ของโทเค็นระบุตัวตน
ใช้ไลบรารีของไคลเอ็นต์ Google API
เราขอแนะนำให้ใช้ไลบรารีของไคลเอ็นต์ Google API สำหรับ Java เพื่อตรวจสอบความถูกต้องของโทเค็น Google ID ในสภาพแวดล้อมฮาร์ดแวร์และซอฟต์แวร์
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;
...
GoogleIdTokenVerifier verifier = new GoogleIdTokenVerifier.Builder(transport, jsonFactory)
// Specify the CLIENT_ID of the app that accesses the backend:
.setAudience(Collections.singletonList(CLIENT_ID))
// Or, if multiple clients access the backend:
//.setAudience(Arrays.asList(CLIENT_ID_1, CLIENT_ID_2, CLIENT_ID_3))
.build();
// (Receive idTokenString by HTTPS POST)
GoogleIdToken idToken = verifier.verify(idTokenString);
if (idToken != null) {
Payload payload = idToken.getPayload();
// Print user identifier
String userId = payload.getSubject();
System.out.println("User ID: " + userId);
// Get profile information from payload
String email = payload.getEmail();
boolean emailVerified = Boolean.valueOf(payload.getEmailVerified());
String name = (String) payload.get("name");
String pictureUrl = (String) payload.get("picture");
String locale = (String) payload.get("locale");
String familyName = (String) payload.get("family_name");
String givenName = (String) payload.get("given_name");
// Use or store profile information
// ...
} else {
System.out.println("Invalid ID token.");
}
เมธอด GoogleIdTokenVerifier.verify() จะยืนยันลายเซ็น JWT, การอ้างสิทธิ์ aud, การอ้างสิทธิ์ iss และการอ้างสิทธิ์ exp
หากต้องการตรวจสอบว่าโทเค็นระบุตัวตนแสดงถึงบัญชีองค์กร Google Workspace หรือ Cloud หรือไม่ คุณสามารถยืนยันการอ้างสิทธิ์ hd ได้โดยตรวจสอบชื่อโดเมนที่แสดงผลโดยเมธอด Payload.getHostedDomain()