擷取使用者(') 已儲存的憑證

使用 Credentials API 提出要求,自動將使用者登入您的應用程式 並為使用者擷取已儲存的憑證

事前準備

設定 Android Studio 專案

建立 CredentialsClient 物件

如要要求儲存的憑證,您必須建立 CredentialsClient 可存取 Credentials API:

CredentialsClient mCredentialsClient;

// ...

mCredentialsApiClient
= Credentials.getClient(this);

建立 CredentialRequest 物件

CredentialRequest 物件會指定 登入系統來要求憑證。建立 對 CredentialRequest 使用 setPasswordLoginSupported 方法 密碼式登入,以及聯合的 setAccountTypes() 方法 登入服務,例如 Google 登入。

mCredentialRequest = new CredentialRequest.Builder()
   
.setPasswordLoginSupported(true)
   
.setAccountTypes(IdentityProviders.GOOGLE, IdentityProviders.TWITTER)
   
.build();

使用 IdentityProviders 中定義的常數 指定常用的登入提供者。如要使用其他登入服務供應商,請使用 專門用來識別供應器的字串。必須使用相同的提供者 ID 儲存憑證,用於擷取憑證。

要求儲存的憑證

建立 CredentialsClientCredentialRequest 物件後,請傳遞要求物件 「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"
             
// ...
         
}
     
});

定義回呼,以使用 addOnCompleteListener() 方法。

處理成功的憑證要求

浮動式訊息表示成功登入 收到成功的憑證要求後,請將產生的 Credential 物件,完成使用者登入應用程式的程序。使用 getAccountType() 方法 判斷已擷取憑證的類型,然後完成適當的登入程序 上傳資料集之後,您可以運用 AutoML 自動完成部分資料準備工作例如,如果是 Google 登入,請建立 GoogleSignInClient 物件,且該物件 包含使用者的 ID,然後使用這個物件啟動登入流程。密碼式 登入時,請使用 Credential 物件中的使用者 ID 和密碼,完成應用程式的 登入程序。

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();
       
// ...
   
}
}

處理多個已儲存的憑證

Smart Lock 帳戶選擇工具

需要使用者輸入內容才能選取憑證時,request() 工作會 失敗時傳回 ResolvableApiException。請確認 getStatusCode() 會傳回 RESOLUTION_REQUIRED 和 呼叫例外狀況的 startResolutionForResult() 方法,提示使用者 選擇帳戶。再從 將 Credential.EXTRA_KEY 傳遞至onActivityResult() getParcelableExtra()敬上 方法。

mCredentialsClient.request(request).addOnCompleteListener(
       
new OnCompleteListener
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, 您可以選擇在收到提示後 使用者可以選擇最近使用的登入資訊,例如電子郵件地址和 並根據這些資訊自動填入表單部分欄位。 請參閱「為使用者提供登入提示」 。

使用者成功登入時,請允許使用者儲存自己的憑證 ,以便在所有裝置上自動進行驗證。