HTTP リクエスト ヘッダーを追加する

HTTP リクエストには、User-Agent や Content-Type などのヘッダーが含まれます。ヘッダーは Android アプリは Cookie や参照 URL などのヘッダーを EXTRA_HEADERS インテント エクストラ。セキュリティ上の理由から、Chrome では一部の追加ヘッダーが除外されます。 インテントが起動される方法と場所によって変わります。

クロスオリジン リクエストでは、クライアントとサーバーの両方に適用されるため、追加のセキュリティ レイヤが必要です。 同じ当事者に属していない可能性があります。このガイドでは、Chrome からこのようなリクエストを開始する方法について説明します。 カスタムタブ、つまり、ブラウザタブで URL を開くアプリから起動されるインテントです。Chrome まで 83 では、デベロッパーはカスタムタブの起動時に任意のヘッダーを追加できます。バージョン 83 以降では、 承認リストに含まれないヘッダーであるため、approvelist クロスオリジン ヘッダーを除くすべてを除外するようになりました セキュリティ上のリスクをもたらしました。Chrome 86 以降、承認リストに含まれないヘッダーを クロスオリジン リクエスト(デジタル アセット リンクを使用してサーバーとクライアントが関連付けられている場合)。 この動作を次の表にまとめます。

Chrome のバージョン 許可される CORS ヘッダー
Chrome 83 より前 承認リスト、非承認リスト
Chrome 83 ~ Chrome 85 承認済み
Chrome 86 以降 デジタル アセット リンクが設定されている場合は、承認リストに登録、非承認リストに登録されています

表 1.:承認リストに含まれない CORS ヘッダーのフィルタリング。

この記事では、サーバーとクライアントの間に確認済みの接続を設定し、その接続を使用する方法について説明します。 を使用して、承認リストと非承認の HTTP ヘッダーを送信できます。スキップして コードについては、カスタムタブ インテントにヘッダーを追加するをご覧ください。

背景

承認リストに登録された CORS リクエスト ヘッダーと非承認リストに登録されていない CORS リクエスト ヘッダー

クロスオリジン リソース シェアリング(CORS)を使用すると、あるオリジンのウェブ アプリケーションが 作成する必要があります。CORS-approvelist ヘッダーのリストは、 HTML 規格。次の表に、承認リストに登録されたヘッダーの例を示します。

ヘッダー 説明
accept-language クライアントが理解できる自然言語を宣伝している
コンテンツ言語 現在の対象者を想定した言葉を記載している
コンテンツ タイプ はリソースのメディアタイプを示します。

表 2.:承認済み CORS ヘッダーの例

承認リストに登録されたヘッダーは、機密データが含まれていないため、安全と見なされます。 サーバーが有害な可能性のあるオペレーションを実行する可能性は低くなります。

次の表に、承認対象から除外されるヘッダーの例を示します。

ヘッダー 説明
bearer-token サーバーでクライアントを認証します。
オリジン リクエストの送信元を示します
Cookie サーバーにより設定された Cookie が含まれます

表 3.:非承認の CORS ヘッダーの例

承認リストにないヘッダーを CORS リクエストに添付することは、HTML 標準とサーバーにより推奨されていません。 クロスオリジン リクエストには、承認リストに登録されたヘッダーのみが含まれていると想定します。承認リストに含まれないヘッダーの送信 悪用され、悪意のあるサードパーティ アプリがユーザーを悪用するヘッダー Chrome(または他のブラウザ)によって保存され、リクエストに添付される Cookie です。Cookie は 認証を行うことを可能にします。

CORS 承認リストに登録されたヘッダーをカスタムタブ リクエストに追加する

カスタムタブは、カスタマイズされたブラウザタブでウェブページを起動するための特別な方法です。カスタムタブ インテントは CustomTabsIntent.Builder() を使用して作成できます。これらのログにヘッダーを添付することもできます。 Browser.EXTRA_HEADERS フラグを指定した Bundle を使用します。

CustomTabsIntent intent = new CustomTabsIntent.Builder(session).build();

Bundle headers = new Bundle();
headers.putString("bearer-token", "Some token");
headers.putString("redirect-url", "Some redirect url");   
intent.intent.putExtra(Browser.EXTRA_HEADERS, headers);

intent.launchUrl(Activity.this, Uri.parse("http://www.google.com"));

承認リストに登録されたヘッダーはいつでも、カスタムタブの CORS リクエストに追加できます。ただし、Chrome は デフォルトで不承認となっている。他のブラウザでは動作が異なる場合がありますが、 承認リストに含まれないヘッダーも、通常はブロックされます。

非承認リストのヘッダーをカスタムタブに含めるには、まず デジタル アクセス リンクを使用したクロスオリジン接続。次のセクションでは、これらを設定する方法について説明します。 必要なヘッダーを含むカスタムタブ インテントを起動します。

カスタムタブ インテントにヘッダーを追加する

承認リストに含まれないヘッダーをカスタムタブ インテントを介して渡すことを許可するには、 Android とウェブ アプリケーションとの間にデジタル アセット リンクを設定し、作成者であることを確認する 両方のアプリケーションを所有します

公式ガイドに沿って、デジタル アセットのリンクを設定します。リンクの関係には、次のコマンドを使用します。 「delegate_permission/common.use_as_origin」は、両方のアプリが同じものであることを示します。 オリジンにルーティングします

追加ヘッダーを使用してカスタムタブ インテントを作成する

カスタムタブ インテントを作成するには、複数の方法があります。使用可能なビルダーを使用して 次のようにして、ビルド依存関係にライブラリを追加します。

MULTI_LINE_CODE_PLACEHOLDER_1

インテントを作成し、追加のヘッダーを追加します。

MULTI_LINE_CODE_PLACEHOLDER_2

カスタムタブ接続は、アプリとシステムの間で CustomTabsSession をセットアップするために使用されます。 Chrome タブ。アプリとウェブアプリが同じオリジンに属していることを確認するために、セッションが必要です。 デジタル アセット リンクが正しく設定されている場合にのみ、検証に合格します。

CustomTabsClient.warmup() を呼び出すことをおすすめします。これにより、ブラウザ アプリケーションで バックグラウンドで事前初期化を行い、URL を開く処理を高速化します。

MULTI_LINE_CODE_PLACEHOLDER_3

検証後にインテントを起動するコールバックをセットアップする

CustomTabsCallback がセッションに渡されました。そこで、 onRelationshipValidationResult(): 以前に作成した CustomTabsIntent を起動します。 オリジンの検証が成功すると 通知されます

MULTI_LINE_CODE_PLACEHOLDER_4

カスタムタブ サービス接続をバインドする

サービスをバインドすると、サービスと接続の onCustomTabsServiceConnected() が起動します。 最終的に呼び出されます。サービスを適切にバインド解除することを忘れないでください。バインディングとバインド解除 一般に、これは onStart() および onStop() アクティビティのライフサイクル メソッドで行われます。

// Bind the custom tabs service connection.
// Call this in onStart()
CustomTabsClient.bindCustomTabsService(this,
    CustomTabsClient.getPackageName(MainActivity.this, null), connection);

// …
// Unbind the custom tabs service.
// Call this in onStop().
unbindService(connection);

デモ アプリケーション コード

カスタムタブ サービスについて詳しくは、こちらをご覧ください。詳しくは、 動作するサンプルアプリの android-browser-helper GitHub リポジトリ。

概要

このガイドでは、カスタムタブの CORS リクエストに任意のヘッダーを追加する方法をデモンストレーションしました。 承認リストに登録されたヘッダーは、すべてのカスタムタブの CORS リクエストに添付できます。承認リストに含まれないヘッダーは、 CORS リクエストで安全でないと見なされ、デフォルトで Chrome でフィルタされます。それらを添付します デジタル アセット リンクによって検証された、同じオリジンのクライアントとサーバーのみに許可。