キャプティブ ポータル ログイン用に Android カスタムタブを実装

Android カスタムタブは、空港、ホテル、飛行機などで見られるキャプティブ ポータルのネットワーク ログイン フロー内で、機能が充実した安全でシームレスなブラウザ エクスペリエンスを直接提供します。ユーザーのメイン ブラウザを認証プロセスに統合することで、カスタムタブは、認証情報と支払いのワンタップ自動入力、DRM で保護されたストリーミング、VPN やプライベート DNS などのセキュリティ機能を使用するユーザー向けの安定した接続などの高度な機能を有効にします。カスタムタブについて詳しくは、Android カスタムタブの概要をご覧ください。

従来の WebView と比較したメリット

カスタムタブを使用してユーザーのメイン ブラウザを統合することで、ネットワーク事業者の従来の WebView ベースの認証フローに固有の機能上の制限をいくつか解消できます。

  • 取引の効率化: 認証情報と保存されたお支払い情報をワンタップで自動入力できるインターフェースにより、ログイン プロセス中の手動データ入力が減ります。(図 1 を参照)。
  • メディアの互換性: プラットフォームは DRM で保護されたコンテンツ(Widevine など)をサポートしており、ポータル内で暗号化された動画ストリームを直接再生できます。(図 2)。
  • セキュリティ構成のサポート: カスタムタブは、VPN やプライベート DNS を使用するデバイスのポータル機能を維持します。これらのセキュリティ機能は、標準ブラウザのリダイレクトが失敗する原因になることがよくあります。
  • インターフェースの整合性: カスタムタブはシステム ブラウザと直接統合され、完全なブラウザ セッションで利用できるものと同じ機能ツールと UI 要素を提供します。
  • バックグラウンドの永続性: ポータルはバックグラウンドで動作し続け、接続期間中、永続的なアクセス ポイントとして機能します。

キャプティブ ポータルの手動入力と自動入力

図 1. 手動入力(WebView)と自動入力(カスタムタブ)。

キャプティブ ポータルの動画再生

図 2. 動画なし(WebView)と動画再生(カスタムタブ)。

カスタムタブの検出と接続フロー

カスタムタブはインターフェースを提供しますが、キャプティブ ポータル API は検出から接続までのインテリジェンス フローを管理します。

  1. 検出: ネットワークは DHCP オプション 114 を使用して API サポートをアドバタイズします。
  2. インタラクション: Android デバイスが API エンドポイントにクエリを送信し、ネットワーク ステータスを含む JSON ペイロードを取得します。
  3. 接続: JSON レスポンスでカスタムタブの使用が示されている場合、システムは基本的なシステム ウィンドウではなく、高性能なブラウザ環境でポータルを開きます。

キャプティブ ポータル API を使用すると、Android デバイスは captive フィールドを使用してキャプティブ ポータルが存在するかどうかを検出できます。この API は、venue-info-urlseconds-remaining などの他のフィールドを Android システム UI に統合します。

キャプティブ ポータルの検出から接続までのフロー

図 3. キャプティブ ポータル API の検出から接続フローまで。

Android カスタムタブを有効にする

カスタムタブのフローをサポートするには、ネットワーク事業者が Captive Portal API を実装し、JSON 構成でオプトインする必要があります。

要件

キャプティブ ポータル ログインでカスタムタブを有効にするには、次のものが必要です。

Android カスタムタブを有効にする

ネットワークがすでに Captive Portal API(RFC 8908)をサポートしている場合は、次のキーと値のペアを既存の JSON レスポンス オブジェクトに追加して、カスタムタブのフローを有効にします。

キー 説明
x-android-use-custom-tabs 361335020 この値は、2026 年 1 月にリリースされた Captive Portal Login Mainline モジュールのバージョン番号を表します。このバージョン以降のモジュール アップデートがあるデバイスは、カスタムタブのログインフローを使用します。

この JSON オブジェクトの例には、Android でサポートされているすべてのキャプティブ ポータル属性が含まれています。

{
  "captive": true,
  "user-portal-url": "https://login.example.com",
  "venue-info-url": "https://venue.example.com",
  "seconds-remaining": 3600,
  "x-android-use-custom-tabs": 361335020
}

使用可能な JSON キャプティブ ポータル属性は次のとおりです。

  • captive: 認証が必要な場合は true に設定し、ユーザーがすでにオンラインの場合は false に設定します。
  • user-portal-url: ログイン ページまたは支払いページの URL。
  • venue-info-url: 情報(フライトの詳細や地図など)を提供するサイトへのリンク。
  • seconds-remaining: デバイスがインターネット接続を維持すると予想される残り時間(秒単位)を示します。
  • x-android-use-custom-tabs: カスタムタブが利用可能な場合に、デバイスがカスタムタブを使用するかどうかを制御します。

キャプティブ ポータル API をサポートする

ネットワークが Captive Portal API をサポートしていない場合は、次の手順に沿って Captive Portal API とカスタムタブ フローを有効にします。

  1. DHCP オプション 114 を含むように DHCP サーバーの構成を更新します。

    • 値: キャプティブ ポータル情報を含む動的に生成された JSON ファイルの完全な HTTPS URL を指定します(例: https://api.yourvenue.com/status)。

    • 結果: Android デバイスがネットワークに参加すると、ブラウザのリダイレクトを待つのではなく、提供された API をクエリします。

  2. 指定された URL で HTTP GET リクエストに応答し、ポータルの現在の状態をデバイスに通知する JSON ファイルを返すように API サーバーを構成します。

    • HTTPS の要件: API サーバーは有効な HTTPS 証明書を使用する必要があります。

    • セキュリティ フォールバック: 証明書が無効であるか自己署名されている場合、デバイスは以前のキャプティブ ポータル動作にフォールバックします。

Android のキャプティブ ポータル検出の動作

キャプティブ ポータル API は、キャプティブ ポータルの存在を検出し、一般的な不整合を回避するための、標準の Android ネットワーク プローブに代わる信頼性の高い方法を提供します。

Android デバイスは、特定の検証 URL に HTTP プローブと HTTPS プローブを同時に送信して、ネットワーク アクセスを確認します。プローブの成功に一貫性がない場合(たとえば、HTTP は成功するが HTTPS は失敗する場合)、部分的な接続状態になり、ログインアプリの自動表示が妨げられる可能性があります。

キャプティブ ポータル API は、次の検出動作を使用して検出の信頼性を高めます。

  • API が "captive": true を報告した場合、システムはポータルの背後にあることを認識し、標準プローブをスキップしてログイン インターフェースをすぐに表示します。
  • API が "captive": false を報告した場合、システムは標準プローブに進み、完全なインターネット アクセスを確認する前に HTTP プローブと HTTPS プローブの両方が成功する必要があります。