[認証] タブを使用して認証を簡素化する

[認証] タブには、Android アプリで使用できる安全で簡素な認証フローが用意されています。AuthTabIntent を作成して起動すると、エンドツーエンドの認証エクスペリエンスを管理するように設計された専用のカスタムタブを呼び出すことができます。このタブは機能が制限されており、ユーザーが目の前のタスクに集中できるようにしています。完了すると、タブは https またはカスタム スキーマを使用して結果をアプリにコールバックします。

フル機能のカスタムタブ
図 1. カスタムタブの全機能。
最小限の機能を含む [認証] タブ
図 2. 最小限の機能を持つ [認証] タブ。

Chrome 132 以降では、Auth Tab で既存のカスタムタブ認証統合を直接置き換えることができます。デバイスが認証タブをサポートしていないユーザーの場合、カスタムタブに自動的にフォールバックします。カスタムタブから認証タブに移行するには、数行のコードを変更します。

仕組み

Auth Tab を使用すると、クライアント アプリは、想定される認証ページを含む URL を読み込むブラウザ ウィンドウを表示する、専用のカスタムタブを起動します。完了すると、Auth タブはコールバックを使用して認証結果を返します。

認証後、指定されたコールバック リダイレクト URI へのナビゲーションが行われた場合、リダイレクトがキャプチャされ、コールバックを使用してクライアント アプリケーションに返されます。https スキーマを使用したリダイレクトの場合、ブラウザは デジタル アセットリンクを使用して、リダイレクト ドメインとクライアント アプリが同じパブリッシャーによって所有されていることを確認します。

クライアントは、指定されたコールバックを使用して、リダイレクト スキーム(または https の場合はリダイレクト ホストとパス)を含む移動先の URI を受け取ります。このデータには、結果コードと、認証インターフェースから提供されるその他のデータが含まれます。このデータを使用して、認証を検証したり、成功しなかったシナリオを処理したりできます。

[認証] タブを使用する理由

Auth Tab の登場以前は、標準のカスタムタブ インテントを使用して認証フローを実現していました。Auth タブを使用することをおすすめします。セキュリティが強化され、操作が簡素化されるだけでなく、認証の内部処理の一部がクライアント コードから抽象化されるためです。こうした理由から、Auth Tab の方が使い勝手がよいでしょう。

強化されたセキュリティ

一般的なカスタムタブの実装では、認証を処理するブラウザ ウィンドウからデータを受信するためにインテントの使用が必要です。これには追加のコードが必要になり、アプリがインテントの干渉を受ける可能性があります。Auth Tab では、コールバックを使用してデータが受信され、Android API とクライアント アプリ間で直接データが転送されます。

効率化されたエクスペリエンス

カスタムタブでは、ユーザーはブラウザの追加機能にアクセスできますが、認証フローでは望ましくない場合があります。認証タブは、標準のカスタムタブで利用できるほとんどのカスタマイズ オプションを削除した、簡素化されたエクスペリエンスを提供します。Chrome ブラウザの場合、これには最小化ボタン、長押しのコンテキスト メニュー、タップして検索、Chrome で開く、ブックマーク、ダウンロード、共有、ホーム画面に追加のメニュー項目が含まれます。

認証タブでは、ブラウザが以前に保存したパスワードと支払いを自動入力する機能、前後に移動する機能、更新する機能、ページ情報を表示する機能、ページのデスクトップ バージョンをリクエストする機能、翻訳を提供する機能が引き続き使用できます。

データ抽象化

Auth Tab のみを実装することで、ブラウザからデータを受信するインテントや、認証が正しく機能するために以前必要だった AndroidManifest.xml のインテント フィルタが不要になります。これにより、クライアント側の複雑さが軽減されます。これらの機能の一部は、ユーザーのデバイスで認証タブを使用できない場合に、カスタムタブとの下位互換性を確保するために、引き続きクライアント コードに含めることができます。

認証タブを実装する

[認証] タブを使用するには、AndroidX ブラウザ認証ライブラリが必要です。AndroidX ブラウザ ライブラリは、プロジェクトの build.gradle ファイルの依存関係セクションに追加できます。この API はアルファ版ビルドで利用できます。ビルドファイルに以下を追加します。

dependencies {
    implementation 'androidx.browser:browser:1.9.0-alpha01'
}

Auth タブを起動する前に、ActivityResultCallerActivityResultCallback を受け入れる ActivityResultLauncher を宣言します。これは、アクティビティまたはフラグメントが作成される前に行われます。

// In your activity

private final ActivityResultLauncher<Intent> mLauncher =
    AuthTabIntent.registerActivityResultLauncher(this, this::handleAuthResult);

private void handleAuthResult(AuthResult result) {
    String message = switch (result.resultCode) {
        case AuthTabIntent.RESULT_OK -> "Received auth result.";
        case AuthTabIntent.RESULT_CANCELED -> "AuthTab canceled.";
        case AuthTabIntent.RESULT_VERIFICATION_FAILED -> "Verification failed.";
        case AuthTabIntent.RESULT_VERIFICATION_TIMED_OUT -> "Verification timed out.";
    }

    if (result.resultCode == AuthTabIntent.RESULT_OK) {
        message += " Uri: " + result.resultUri;
    }

    Toast.makeText(this, message, Toast.LENGTH_LONG).show();  
}

次に、AuthTabIntent.Builder を使用して AuthTabIntent を作成し、launch メソッドを呼び出します。起動方法は、必要なスキームに基づいて、次の 2 つのパラメータ セットのいずれかを受け取ります。

  • redirectScheme: カスタム リダイレクト スキームの場合、ブラウザは指定されたスキームを使用して URI をリダイレクトして返します。

  • redirectHost、redirectPath: https リダイレクト スキームの場合、ブラウザがリダイレクトを検出して URI を返すには、API に別々のホストとパスが必要です。https を使用する場合は、デジタル アセットリンクの確認が必要です。

private void launchAuthTab() {
    AuthTabIntent authTabIntent = new AuthTabIntent.Builder.build();
    authTabIntent.launch(mLauncher, Uri.parse("https://www.example.com/auth"), "mycustomscheme");
}

private void launchAuthTabHttps() {
    String host = "your_host";
    String path = "your_path";
    AuthTabIntent authTabIntent = new AuthTabIntent.Builder.build();
    authTabIntent.launch(mLauncher, Uri.parse("https://www.example.com/auth", host, path);
}

カスタムタブから認証タブに移行する

カスタムタブ インテントを新しい Auth Tab インテントに変更して、既存のカスタムタブ認証の実装を更新します。コードを追加したら、カスタムタブ インテントを探し、新しい認証タブ インテントに合わせて変更します。

CustomTabsIntent customTabsIntent = new CustomTabsIntent.Builder().build();
customTabsIntent.launchUrl(context, uri)

// change to -->

AuthTabIntent authTabIntent = new AuthTabIntent.Builder.build();

authTabIntent.launch(mLauncher, Uri.parse("https://www.example.com/auth", "mycustomscheme");

/* - OR - */

authTabIntent.launch(mLauncher, Uri.parse("https://www.example.com/auth", host, path);

カスタムタブへのフォールバック

実装によっては、ユーザーのデバイスが認証タブを処理できない場合に認証が必要になる場合があります。たとえば、デフォルトのブラウザが認証タブをサポートしていない場合や、デフォルトのブラウザのバージョンが必要なレベルに達していない場合に、この問題が発生することがあります。このような場合、カスタムタブをサポートしているブラウザでは、Auth Tab インテントの代わりにカスタムタブが自動的に起動されます。

この状況を適切に処理するには、認証フローを処理する既存のカスタムタブ コードをフォールバックとして維持しながら、認証タブの実装を追加します。

Auth Tab 対応デバイスを使用しているユーザーには新しい Auth Tab フローが表示され、それ以外のユーザーには従来のカスタムタブの実装がフォールバックされます。ActivityResultCallback またはアクティビティ インテントに届く可能性があるデータを処理する際には注意してください。AuthTabIntent を使用してフォールバック エクスペリエンスを起動し、現在のブラウザで認証タブがサポートされていない場合、カスタムタブが閉じられると、アプリは Activity.RESULT_CANCELED の結果を受け取ります。

Custom Tabs にフォールバックする Auth Tab の実装例については、Android Browser Helper ライブラリをご覧ください。

参考情報