認証情報の保存でパスワードを保存する

リピーター向けにワンタップ ログインを有効にするには、Google にパスワードを保存するようユーザーに求めるメッセージを表示します。ユーザーは、アプリとウェブで保存したパスワードを使用してログインできるようになります。

パスワード保存フローを開始すると、ユーザーにボトムシート ダイアログが表示され、パスワードを保存するかどうかと、保存する Google アカウントを選択できます。

パスワードの保存のスクリーンショット

パスワード保存ボトムシート ダイアログを起動する

バックエンドでユーザー名とパスワードを認証した後に、パスワード保存ダイアログを起動する必要があります。認証中に認証情報をメモリに保持します。認証情報が有効であることを確認したら、次の手順で保存ダイアログを起動します。

  1. 新しい SignInPassword オブジェクトを作成します。サービスで使用するユーザー ID(ユーザー名やメールアドレスなど)と、保存するパスワードで初期化する必要があります。

    private static final int REQUEST_CODE_GIS_SAVE_PASSWORD = 2; /* unique request id */
    private void savePassword() {
        SignInPassword signInPassword = new SignInPassword(userId, password);
        ...
    
  2. SavePasswordRequest オブジェクトを作成する

    SavePasswordRequest savePasswordRequest =
        SavePasswordRequest.builder().setSignInPassword(signInPassword).build();
    
  3. PendingIntent を取得して Identity.getCredentialSavingClient からパスワード保存ダイアログを表示し、フローを起動します。

    Identity.getCredentialSavingClient(activity)
       .savePassword(savePasswordRequest)
       .addOnSuccessListener(
           result -> {
               startIntentSenderForResult(
                   result.getPendingIntent().getIntentSender(),
                   REQUEST_CODE_GIS_SAVE_PASSWORD,
                   /* fillInIntent= */ null,
                   /* flagsMask= */ 0,
                   /* flagsValue= */ 0,
                   /* extraFlags= */ 0,
                   /* options= */ null);
           })
    

パスワード保存の結果を処理する

onActivityResult でパスワード保存フローの結果を処理します。

@Override
public void onActivityResult(int requestCode, int resultCode, Intent data) {
    super.onActivityResult(requestCode, resultCode, data);
    if (requestCode == REQUEST_CODE_GIS_SAVE_PASSWORD) {
        if (resultCode == Activity.RESULT_OK) {
            /* password was saved */
        } else if (resultCode == Activity.RESULT_CANCELED) {
            /* password saving was cancelled */
        }
    }
}
private ActivityResultLauncher<IntentSenderRequest> savePasswordHandler =
    registerForActivityResult(new ActivityResultContracts.StartIntentSenderForResult(), result -> {
        // handle intent result here
    });