ให้ผู้ใช้ลงชื่อเข้าใช้แอปของคุณโดยอัตโนมัติโดยใช้ Credentials API เพื่อขอ และเรียกข้อมูลเข้าสู่ระบบที่จัดเก็บไว้สำหรับผู้ใช้
ก่อนเริ่มต้น
กำหนดค่าโปรเจ็กต์ Android Studio
สร้างออบเจ็กต์ CredentialsClient
หากต้องการขอข้อมูลเข้าสู่ระบบที่จัดเก็บไว้ คุณต้องสร้างอินสแตนซ์ของ
CredentialsClient
เพื่อเข้าถึง Credentials API
CredentialsClient mCredentialsClient;
// ...
mCredentialsApiClient = Credentials.getClient(this);
สร้างออบเจ็กต์ CredentialRequest
ออบเจ็กต์ CredentialRequest
จะระบุ
ระบบลงชื่อเข้าใช้ที่คุณต้องการขอข้อมูลเข้าสู่ระบบ สร้าง
CredentialRequest
ที่ใช้เมธอด setPasswordLoginSupported
สำหรับ
การลงชื่อเข้าใช้ด้วยรหัสผ่าน และวิธี setAccountTypes()
สำหรับการรวมศูนย์
บริการลงชื่อเข้าใช้ เช่น Google Sign-In
mCredentialRequest = new CredentialRequest.Builder()
.setPasswordLoginSupported(true)
.setAccountTypes(IdentityProviders.GOOGLE, IdentityProviders.TWITTER)
.build();
ใช้ค่าคงที่ที่ระบุไว้ใน IdentityProviders
เพื่อระบุผู้ให้บริการการลงชื่อเข้าใช้ที่ใช้กันโดยทั่วไป สำหรับผู้ให้บริการลงชื่อเข้าใช้รายอื่นๆ ให้ใช้
สตริงที่ระบุผู้ให้บริการโดยไม่ซ้ำกัน คุณต้องใช้ตัวระบุผู้ให้บริการเดียวกัน
เพื่อจัดเก็บข้อมูลเข้าสู่ระบบเมื่อคุณใช้เรียกข้อมูลเข้าสู่ระบบ
ขอข้อมูลเข้าสู่ระบบที่จัดเก็บไว้
หลังจากที่คุณสร้างออบเจ็กต์ CredentialsClient
และ CredentialRequest
แล้ว ให้ส่งออบเจ็กต์คำขอ
ไปยัง CredentialsClient.request()
วิธีขอข้อมูลเข้าสู่ระบบที่จัดเก็บไว้สำหรับแอปของคุณ
mCredentialsClient.request(mCredentialRequest).addOnCompleteListener(
new OnCompleteListener<CredentialRequestResponse>() {
@Override
public void onComplete(@NonNull Task<CredentialRequestResponse> task) {
if (task.isSuccessful()) {
// See "Handle successful credential requests"
onCredentialRetrieved(task.getResult().getCredential());
return;
}
// See "Handle unsuccessful and incomplete credential requests"
// ...
}
});
กำหนด Callback เพื่อจัดการคำขอที่สำเร็จและล้มเหลวโดยใช้
addOnCompleteListener()
วิธี
จัดการคำขอข้อมูลเข้าสู่ระบบที่ประสบความสำเร็จ
ในคำขอข้อมูลเข้าสู่ระบบที่สำเร็จ ให้ใช้ผลลัพธ์
Credential
เพื่อลงชื่อเข้าใช้ให้ผู้ใช้
ในแอปของคุณให้เสร็จสมบูรณ์ ใช้เมธอด getAccountType()
เพื่อระบุประเภทของข้อมูลเข้าสู่ระบบที่ดึงมา จากนั้นลงชื่อเข้าใช้ที่เหมาะสม
ขั้นตอนได้ ตัวอย่างเช่น สำหรับ Google Sign-In ให้สร้างออบเจ็กต์ GoogleSignInClient
ที่
รวมรหัสผู้ใช้ จากนั้นใช้ออบเจ็กต์เพื่อเริ่มขั้นตอนการลงชื่อเข้าใช้ สำหรับแบบใช้รหัสผ่าน
ลงชื่อเข้าใช้ แล้วใช้รหัสและรหัสผ่านของผู้ใช้จากออบเจ็กต์ข้อมูลเข้าสู่ระบบเพื่อดำเนินการกับแอปให้เสร็จสมบูรณ์
ขั้นตอนการลงชื่อเข้าใช้
private void onCredentialRetrieved(Credential credential) {
String accountType = credential.getAccountType();
if (accountType == null) {
// Sign the user in with information from the Credential.
signInWithPassword(credential.getId(), credential.getPassword());
} else if (accountType.equals(IdentityProviders.GOOGLE)) {
// The user has previously signed in with Google Sign-In. Silently
// sign in the user with the same ID.
// See https://developers.google.com/identity/sign-in/android/
GoogleSignInOptions gso =
new GoogleSignInOptions.Builder(GoogleSignInOptions.DEFAULT_SIGN_IN)
.requestEmail()
.build();
GoogleSignInClient signInClient = GoogleSignIn.getClient(this, gso);
Task<GoogleSignInAccount> task = signInClient.silentSignIn();
// ...
}
}
จัดการข้อมูลเข้าสู่ระบบที่บันทึกไว้หลายรายการ
เมื่อต้องป้อนข้อมูลจากผู้ใช้เพื่อเลือกข้อมูลเข้าสู่ระบบ งาน request()
จะ
ล้มเหลวด้วย ResolvableApiException
โปรดตรวจสอบว่า
getStatusCode()
ส่งคืน RESOLUTION_REQUIRED
และ
เรียกใช้เมธอด startResolutionForResult()
ของข้อยกเว้นเพื่อแสดงข้อความแจ้งผู้ใช้
เพื่อเลือกบัญชี จากนั้นให้ดึงข้อมูลเข้าสู่ระบบที่ผู้ใช้เลือกจาก
เมธอด onActivityResult()
ของกิจกรรม โดยส่ง Credential.EXTRA_KEY
ไปยัง
getParcelableExtra()
mCredentialsClient.request(request).addOnCompleteListener( new OnCompleteListener() { @Override public void onComplete(@NonNull Task task) { if (task.isSuccessful()) { // ... return; } Exception e = task.getException(); if (e instanceof ResolvableApiException) { // This is most likely the case where the user has multiple saved // credentials and needs to pick one. This requires showing UI to // resolve the read request. ResolvableApiException rae = (ResolvableApiException) e; resolveResult(rae, RC_READ); } else if (e instanceof ApiException) { // The user must create an account or sign in manually. Log.e(TAG, "Unsuccessful credential request.", e); ApiException ae = (ApiException) e; int code = ae.getStatusCode(); // ... } } });
private void resolveResult(ResolvableApiException rae, int requestCode) {
try {
rae.startResolutionForResult(MainActivity.this, requestCode);
mIsResolving = true;
} catch (IntentSender.SendIntentException e) {
Log.e(TAG, "Failed to send resolution.", e);
hideProgress();
}
}
@Override
public void onActivityResult(int requestCode, int resultCode, Intent data) {
super.onActivityResult(requestCode, resultCode, data);
// ...
if (requestCode == RC_READ) {
if (resultCode == RESULT_OK) {
Credential credential = data.getParcelableExtra(Credential.EXTRA_KEY);
onCredentialRetrieved(credential);
} else {
Log.e(TAG, "Credential Read: NOT OK");
Toast.makeText(this, "Credential Read Failed", Toast.LENGTH_SHORT).show();
}
}
// ...
}
เมื่อไม่พบข้อมูลเข้าสู่ระบบ ผู้ใช้ต้องสร้างบัญชีหรือด้วยตนเอง
ลงชื่อเข้าใช้ หากเป็น getStatusCode()
ส่งคืน SIGN_IN_REQUIRED
,
คุณสามารถเร่งขั้นตอนการลงชื่อสมัครใช้และการลงชื่อเข้าใช้โดยการแสดงข้อความแจ้ง
ผู้ใช้จะเลือกข้อมูลการลงชื่อเข้าใช้ที่ใช้ล่าสุด เช่น อีเมลและ
แล้วป้อนข้อมูลนั้นลงในฟิลด์ของแบบฟอร์มโดยอัตโนมัติ
โปรดดูหัวข้อมอบคำแนะนำในการลงชื่อเข้าใช้ให้แก่ผู้ใช้
เพื่อดูรายละเอียด
เมื่อลงชื่อเข้าใช้สำเร็จ ให้อนุญาตให้ผู้ใช้บันทึกข้อมูลเข้าสู่ระบบ เพื่อตรวจสอบสิทธิ์ในอนาคตโดยอัตโนมัติในอุปกรณ์ทุกเครื่อง