One Tap 로그인이 요구 사항을 충족하는 경우 대신 사용하는 것이 좋습니다. One Tap에는 업데이트 된 사용자 경험과 기타 개선 사항이 있습니다.

사용자의 저장된 자격 증명 검색

Credentials API를 사용하여 사용자를 위해 저장된 자격 증명을 요청하고 검색하여 사용자를 앱에 자동으로 로그인합니다.

시작하기 전에

Android Studio 프로젝트를 구성합니다 .

CredentialsClient 개체 만들기

요청에 저장된 자격 증명에, 당신의 인스턴스를 생성해야합니다 CredentialsClient 자격 증명 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() 메서드를 사용하여 검색된 자격 증명의 유형을 getAccountType() 다음 적절한 로그인 프로세스를 완료합니다. 예를 들어 Google 로그인의 경우 사용자 ID를 포함하는 GoogleSignInClient 개체를 만든 다음 개체를 사용하여 로그인 흐름을 시작합니다. 비밀번호 기반 로그인의 경우 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 계정 선택기

자격 증명을 선택하기 위해 사용자 입력이 필요한 경우 ResolvableApiException 과 함께 request() 작업이 실패합니다. 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 반환하는 경우 사용자에게 최근에 사용한 로그인 정보를 선택하라는 메시지를 표시하여 가입 및 로그인 프로세스를 신속하게 처리 할 수 ​​있습니다. 이메일 주소와 이름 등을 입력하고 해당 정보로 양식의 일부 필드를 자동으로 채 웁니다. 자세한 내용 은 사용자에게 로그인 힌트 제공 을 참조하세요.

로그인에 성공하면 사용자가 자격 증명저장하여 모든 장치에서 향후 인증을 자동화 할 수 있습니다.