사용자에게 로그인 힌트 제공

사용자가 아직 사용자 인증 정보를 저장하지 않았거나 사용자가 아직 앱에 가입하지 않은 경우 사용자 인증 정보 검색 요청이 실패할 수 있습니다. 이러한 상황에서는 Credentials API를 사용하여 사용자 이름 및 이메일 주소와 같은 로그인 힌트를 검색합니다. 이러한 힌트를 사용하여 앱의 로그인 및 가입 양식을 미리 채우면 앱 온보딩 프로세스의 속도가 빨라집니다.

Android 6.0 (Marshmallow) 이상에서는 앱이 Credentials API로 로그인 힌트를 가져오기 위해 기기 또는 런타임 권한을 요청할 필요가 없습니다.

시작하기 전에

Android 스튜디오 프로젝트 구성

로그인 힌트 가져오기

로그인 힌트를 검색하려면 먼저 HintRequest 객체를 만들어 힌트 선택기 대화상자를 구성합니다. 그런 다음 HintRequest 객체를 CredentialsClient.getHintPickerIntent()에 전달하여 사용자에게 이메일 주소를 선택하라는 메시지를 표시하는 인텐트를 가져옵니다. 마지막으로 startIntentSenderForResult()로 인텐트를 시작합니다.

HintRequest hintRequest = new HintRequest.Builder()
        .setHintPickerConfig(new CredentialPickerConfig.Builder()
                .setShowCancelButton(true)
                .build())
        .setEmailAddressIdentifierSupported(true)
        .setAccountTypes(IdentityProviders.GOOGLE)
        .build();

PendingIntent intent = mCredentialsClient.getHintPickerIntent(hintRequest);
try {
    startIntentSenderForResult(intent.getIntentSender(), RC_HINT, null, 0, 0, 0);
} catch (IntentSender.SendIntentException e) {
    Log.e(TAG, "Could not start hint picker Intent", e);
}

Smart Lock 로그인 힌트 선택기

사용할 이메일 주소를 선택하라는 메시지가 사용자에게 표시됩니다.

그런 다음 활동의 onActivityResult() 메서드에서 Credential.EXTRA_KEY parcel에서 힌트를 가져와 사용자가 사용자 데이터베이스에 있는지 확인한 후 사용자 인증 정보 힌트를 사용하여 적절한 활동을 시작합니다.

@Override
public void onActivityResult(int requestCode, int resultCode, Intent data) {
    super.onActivityResult(requestCode, resultCode, data);

    if (requestCode == RC_HINT) {
        if (resultCode == RESULT_OK) {
            Credential credential = data.getParcelableExtra(Credential.EXTRA_KEY);
            Intent intent;
            // Check for the user ID in your user database.
            if (userDatabaseContains(credential.getId())) {
                intent = new Intent(this, SignInActivity.class);
            } else {
                intent = new Intent(this, SignUpNewUserActivity.class);
            }
            intent.putExtra("com.mycompany.myapp.SIGNIN_HINTS", credential);
            startActivity(intent);
        } else {
            Log.e(TAG, "Hint Read: NOT OK");
            Toast.makeText(this, "Hint Read Failed", Toast.LENGTH_SHORT).show();
        }
    }

    ...

}

로그인 양식 미리 작성하기

사용자가 사용자 데이터베이스에 있고 앱의 로그인 활동을 시작한 경우 선택적으로 Credential 객체에 ID 토큰이 포함되어 있는지 확인할 수 있습니다. 이 경우 사용자에게 비밀번호를 입력하지 않고도 ID 토큰으로 사용자를 로그인할 수 있습니다.

Credential 객체에 ID 토큰이 포함되어 있지 않거나 ID 토큰을 사용하지 않으려는 경우 인텐트에 추가한 힌트로 로그인 필드를 미리 채웁니다.

public class SignInActivity extends Activity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);

        Intent intent = getIntent();
        Credential credential = intent.getParcelableExtra("com.mycompany.myapp.SIGNIN_HINTS");

        // Pre-fill ID field
        mUsernameView.setText(credential.getId());

        ...
    }

    ...
}

가입 양식 미리 작성하기

사용자가 사용자 데이터베이스에 없고 앱의 가입 활동을 시작했다면 인텐트에 추가한 로그인 힌트로 가입 필드를 미리 채웁니다.

public class SignUpNewUserActivity extends Activity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);

        Intent intent = getIntent();
        Credential credential = intent.getParcelableExtra("com.mycompany.myapp.SIGNIN_HINTS");

        // Pre-fill sign-up fields
        mUsernameView.setText(credential.getId());
        mDisplaynameView.setText(credential.getName()); // Might be null.

        ...
    }

    ...
}

필요한 경우 확인된 이메일 주소가 있는 ID 토큰Credential 객체에 포함되어 있는지 확인할 수도 있습니다. 이 경우 이메일 주소가 Google에서 이미 확인되었으므로 앱의 이메일 인증 단계를 건너뛸 수 있습니다.