사용자의 저장된 사용자 인증 정보 검색

Credentials API를 통해 사용자가 앱에 자동으로 로그인되도록 하여 저장된 사용자 인증 정보를 요청하고 가져옵니다.

시작하기 전에

Android 스튜디오 프로젝트 구성

CredentialsClient 객체 만들기

저장된 사용자 인증 정보를 요청하려면 CredentialsClient 인스턴스를 만들어 Credentials API에 액세스해야 합니다.

CredentialsClient mCredentialsClient;

// ...

mCredentialsApiClient = Credentials.getClient(this);

CredentialRequest 객체 만들기

CredentialRequest 객체는 사용자 인증 정보를 요청하려는 로그인 시스템을 지정합니다. 비밀번호 기반 로그인에는 setPasswordLoginSupported 메서드를 사용하고 Google 로그인과 같은 제휴 로그인 서비스에는 setAccountTypes() 메서드를 사용하여 CredentialRequest를 빌드합니다.

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

IdentityProviders에 정의된 상수를 사용하여 일반적으로 사용되는 로그인 제공업체를 지정합니다. 다른 로그인 제공업체의 경우 제공업체를 고유하게 식별하는 문자열을 사용합니다. 사용자 인증 정보를 검색할 때 사용하는 것과 동일한 제공업체 식별자를 사용하여 사용자 인증 정보를 저장해야 합니다.

저장된 사용자 인증 정보 요청

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() 메서드를 사용하여 가져온 사용자 인증 정보의 유형을 확인한 후 적절한 로그인 프로세스를 완료합니다. 예를 들어 Google 로그인의 경우 사용자의 ID를 포함하는 GoogleSignInClient 객체를 만든 후 이 객체를 사용하여 로그인 과정을 시작합니다. 비밀번호 기반 로그인의 경우 사용자 인증 정보 객체의 사용자 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_KEYgetParcelableExtra() 메서드에 전달하여 사용자가 선택한 사용자 인증 정보를 활동의 onActivityResult() 메서드에서 가져옵니다.

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를 반환하면 사용자에게 이메일 주소와 이름 등 최근에 사용한 로그인 정보를 선택하라는 메시지를 표시하고 이 정보로 양식의 일부 필드를 자동으로 채우는 방식으로 가입 및 로그인 프로세스를 빠르게 진행할 수 있습니다. 자세한 내용은 사용자에게 로그인 힌트 제공을 참고하세요.

로그인에 성공하면 사용자가 사용자 인증 정보를 저장하여 모든 기기에서 향후 인증을 자동화하도록 허용합니다.