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

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

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

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

仕組み

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

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

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

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

Auth Tab の前は、標準の Custom Tabs インテントを使用して認証フローを強化できました。Auth Tab は、セキュリティの強化、エクスペリエンスの合理化、認証の内部処理の一部をクライアント コードから抽象化できるため、推奨されます。こうした理由から、Auth Tab の方が優れたエクスペリエンスを提供します。

強化されたセキュリティ

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

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

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

認証タブには、以前に保存したパスワードや支払い情報の自動入力、前後のページへの移動、更新、ページ情報の表示、ページのパソコン版のリクエスト、翻訳などのブラウザ機能が引き続き用意されています。

データ抽象化

Auth Tab のみを実装すると、ブラウザからデータを受け取るインテントや、認証が正しく機能するために以前は AndroidManifest.xml で必要だったインテント フィルタが不要になります。これにより、クライアント側の複雑さが解消されます。これらの機能の一部は、ユーザーのデバイスで Auth Tab が利用できない状況で Custom Tabs との下位互換性を提供するために、クライアント コードに含めることができます。

認証タブを実装する

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

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

Auth Tab を起動する前に、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 メソッドを呼び出します。起動メソッドは、必要なスキームに応じて次のいずれかのパラメータ セットを受け取ります。

  • 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 インテントに変更して、既存のカスタムタブ認証の実装を更新します。コードを追加したら、カスタムタブ インテントを見つけて、新しい 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 インテントの代わりにカスタムタブが自動的に起動します。

CustomTabsClient#isAuthTabSupported() を使用して、ブラウザで Auth Tab がサポートされているかどうかを確認できます。このメソッドを使用すると、アプリはブラウザの機能に基づいて、認証タブまたはカスタムタブのフローを動的に選択できます。Auth Tab がサポートされていない状況に適切に対応するには、既存の Custom Tabs コードで認証フローをフォールバックとして処理しつつ、Auth Tab の実装を追加します。

ActivityResultCallback または Activity インテントのいずれかに渡される可能性のあるデータを処理する際は注意してください。AuthTabIntent を使用してフォールバック エクスペリエンスを起動し、現在のブラウザが Auth Tab をサポートしていない場合、カスタムタブが閉じられると、アプリは Activity.RESULT_CANCELED の結果を受け取ります。

カスタムタブにフォールバックする Auth Tab の実装例は、Android Browser Helper ライブラリにあります。

参考情報