ウェブサイトと Android アプリ間で認証情報をシームレスに共有する

1. 概要

ユーザーはウェブサイトと Android アプリの両方からサービスにアクセスしますか?プラットフォームごとに個別にログインを求めることは、不要な摩擦を生み、離脱につながる可能性があります。

Digital Asset Links(DAL)は、ウェブサイトとアプリの関連付けを宣言できるようにすることで、この問題を解決します。これにより、Google パスワード マネージャーなどのパスワード マネージャー間で、保存されたパスワードとパスキーを共有できます。

具体的には、デジタル アセット リンク ファイルの構成には、共有する内容に応じて異なる関係が必要です。

  • パスワードの場合: delegate_permission/common.get_login_creds を含めると、パスワード マネージャーでウェブサイトとアプリ間で保存したパスワードを共有できます。
  • パスキーの場合: パスキーは特定のウェブドメインに厳密にバインドされているため、Android ではドメインの所有権の証明が必要です。そのため、delegate_permission/common.handle_all_urls を含める必要があります。これは Android アプリリンク(ディープリンク)で使用される権限ですが、あるプラットフォームで作成されたパスキーを別のプラットフォームで使用できるようにするための厳格な要件でもあります。

その結果、ユーザーは、提携プラットフォームのいずれか 1 つに保存したパスワードまたはパスキーを使用して、提携プラットフォーム間でシームレスにログインできます。

プロパティ間で利用可能なパスワード

認証情報のシームレスな共有を実装すると、ユーザー エクスペリエンスを大幅に向上させることができます。たとえば、eBay では、認証情報の共有に DAL を実装した後、ログイン成功率が 10% 増加しました

この Codelab では、Digital Asset Links を使用してウェブサイトと Android アプリ間で認証情報を共有する方法を学びます。

前提条件

学習内容

  • Google Play Console を使用して認証情報の共有を設定する方法(推奨)。
  • assetlinks.json ファイルを手動で作成する方法。
  • 手動関連付け用に Android アプリを構成する方法。
  • ウェブサイトのドメインと関連付けて Android アプリでパスキーを有効にする方法。
  • ツールを使用して設定を生成、検証する方法。

必要なもの

  • ウェブサイト: https://{your-domain}/.well-known/assetlinks.json で JSON ファイルをホストできること。
  • Android アプリ:
    • Google Play Console の方法の場合: Google Play で公開されているアプリ。
    • 手動の方法の場合: 変更とビルドが可能な Android プロジェクト。Google パスワード マネージャーとの認証情報の共有を機能させるには、アプリが Google Play で公開されている必要があります。

仕組み

認証情報の共有を機能させるには、双方向の信頼を確立する必要があります。

  1. ウェブ -> アプリ: ウェブサイトで、Android アプリを信頼することを宣言する assetlinks.json ファイルをホストする必要があります。
  2. アプリ -> ウェブ: ウェブサイトを信頼するように Android アプリを設定する必要があります。

この記事では、Google Play Console を使用する自動の方法(推奨)と、Digital Asset Links を直接使用する手動の方法の 2 つの方法について説明します。

2. Google Play Console を使用してセットアップする(推奨)

ウェブサイトと Android アプリの間で認証情報を共有する最も簡単な方法は、Google Play Console を使用することです。この方法では、アプリのマニフェストを変更したり、アプリの新しいバージョンを公開したりすることなく、アプリをウェブサイトに関連付けることができます。アプリ側の関連付けは Google Play が管理します。

前提条件

  • ディープリンク ページにアクセスするための Google Play Console の権限。
  • ドメインに /.well-known/assetlinks.json ファイルを公開できること。

ディープリンクについて詳しくは、Android アプリリンクをご覧ください。

手順

  1. Google Play Console で、[成長] > [ディープリンク] に移動します。
  2. ドメインが表示されていない場合は、[アプリの設定] で [ドメインを追加] をクリックします。
  3. ドメインを見つけて、[認証情報の共有] 列を探します。[有効にする] をクリックします(または、新しいドメインで [認証情報の共有を有効にする] がオンになっていることを確認します)。
  4. Google Play Console で生成された JSON スニペットをコピーします。
  5. この JSON コンテンツを https://{your-domain}/.well-known/assetlinks.json に公開します。(このファイルがすでに存在する場合は、新しいステートメントを追加します)。
  6. Google Play Console に戻り、[ウェブサイトの関連付けを作成] または [認証情報の共有を有効にする] をクリックします。

Google Play Console でホスティング設定の確認が開始されます。

Google Play Console のディープリンク

認証情報の共有が機能するには、ウェブサイトのホストが次の要件を満たしている必要があります。

  • URL が HTTPS でアクセス可能である。
  • サーバーが Content-Type: application/json で応答します。
  • URL にリダイレクトなしでアクセスできる。

確認が完了すると、認証情報の共有が有効になります。構成の変更が反映されるまでに 1 ~ 2 週間かかることがあります。

3. Digital Asset Links を使用して手動で設定する

より細かい管理が必要であれば、Google Play Console にアクセスできない場合は、ウェブサイトと Android アプリの間で認証情報の共有を手動で構成できます。これには、サイトで JSON ファイルをホストすることと、Android アプリのマニフェストを更新するという 2 つの主なタスクがあります。

1. アプリのデジタル フィンガープリントを取得する

認証情報のシームレスな共有を設定する前に、各プラットフォームで次のことを確認してください。

Android アプリごとに、次の操作を行います。

2. 関連付けファイルを作成する

ウェブサイトとアプリの関係を宣言する assetlinks.json ファイルを作成する必要があります。delegate_permission/common.get_login_creds を使用してパスワードの共有権限を付与し、delegate_permission/common.handle_all_urls を使用してディープリンクを有効にしてパスキーを共有します。

次の内容で assetlinks.json という名前のファイルを作成します。置き換える: サンプルの値を、実際のサイト URL、パッケージ名、フィンガープリントに置き換えます。

[{
  "relation": [
    "delegate_permission/common.handle_all_urls",
    "delegate_permission/common.get_login_creds"
    ],
  "target": {
    "namespace": "android_app",
    "package_name": "com.example.app",
    "sha256_cert_fingerprints":
    ["14:6D:E9:83:C5:73:06:50:D8:EE:B9:95:2F:34:FC:64:16:A0:83:42:E6:1D:BE:A8:8A:04:96:B2:3F:CF:44:E5"]
  }
}]

3. ファイルをホストする

assetlinks.json ファイルをドメインのルートにある .well-known ディレクトリにアップロードします。

場所: https://{your-domain}/.well-known/assetlinks.json

認証情報の共有が機能するには、ウェブサイトのホストが次の要件を満たしている必要があります。

  • URL が HTTPS でアクセス可能である。
  • サーバーが Content-Type: application/json で応答します。
  • URL にリダイレクトなしでアクセスできる。

Web to App

4. Android アプリを構成する

次に、Android アプリにウェブサイトを信頼するように指示します。マニフェストに、assetlinks.json URL を含むリソース ファイルを指す参照を追加します。

1. 文字列リソースを追加する

res/values/strings.xml に新しい文字列 asset_statements を追加します。エスケープされた引用符に注意してください。

<resources>
    <string name="asset_statements" translatable="false">
      [{
        \"include\": \"https://www.example.com/.well-known/assetlinks.json\"
      }]
    </string>
</resources>

2. マニフェストにメタデータを追加する

AndroidManifest.xml で、この文字列リソースを参照する <application> 要素内に <meta-data> タグを追加します。

<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.example.app">

    <application
        android:allowBackup="true"
        android:icon="@mipmap/ic_launcher"
        android:label="@string/app_name"
        android:theme="@style/AppTheme">

        <meta-data
            android:name="asset_statements"
            android:resource="@string/asset_statements" />

        <activity android:name=".MainActivity">
                <intent-filter>
                    <action android:name="android.intent.action.MAIN" />
                    <category android:name="android.intent.category.LAUNCHER" />
                </intent-filter>
            </activity>
        </application>
    </manifest>

これらの手順を完了して Android アプリの新しいバージョンを公開すると、Digital Asset Links をサポートするパスワード マネージャー(Google パスワード マネージャーなど)は、ユーザーが com.example.app にログインしようとしたときに、www.example.com 用に保存された認証情報を提案できるようになります。また、その逆も可能です。

4. 設定を確認する

リリースする前に、デジタル アセット リンクの設定を確認することが重要です。JSON が正しくない場合やファイルにアクセスできない場合は、エラーは表示されません。

公式の ステートメント生成ツールと検証ツールを使用します。

ステートメントの生成ツールとバリデータ

  1. サイトのドメインアプリ パッケージ名を入力します。
  2. [Test Statement] をクリックします。
  3. このツールは、assetlinks.json ファイルが正しくホストされ、有効な関連付けが含まれているかどうかを確認します。

5. 複数のウェブサイト間で認証情報を共有する

Web to App

同じログイン システムを共有する複数のウェブサイト(example.comexample.co.uk など)がある場合は、それらを関連付けられていると宣言することで、認証情報を共有できます。

複数のウェブサイト間でパスワードを共有する

ウェブサイト間でパスワードを共有するには、delegate_permission/common.get_login_creds を使用して web から web への関連付けを宣言します。

たとえば、example.comexample.co.uk とパスワードを共有するには、https://example.com/.well-known/assetlinks.json でホストされている assetlinks.json ファイルに example.co.uk を対象とするステートメントを含める必要があります。

[{
  "relation": ["delegate_permission/common.get_login_creds"],
  "target": {
    "namespace": "web",
    "site": "https://example.co.uk"
  }
}]

同様に、https://example.co.uk/.well-known/assetlinks.json には example.com を対象とするステートメントを含める必要があります。

複数のウェブサイト間でパスキーを共有する

複数のウェブサイトで同じパスキーを共有できるようにするには、同じ Relying Party ID(RP ID)を使用する必要があります。WebAuthn とパスキーでは、RP ID はドメイン名で認証情報のスコープを指定します。パスキーを作成すると、特定の RP ID に関連付けられ、その ID のスコープ内のドメインでのみ使用できます。RP ID を正しく定義することで、サブドメイン、クロスサイト オリジン、ファースト パーティ モバイルアプリ全体でシームレスなパスキー エクスペリエンスが実現します。RP ID の設定について詳しくは、リライング パーティ ID(RP ID)についてをご覧ください。関連するオリジン リクエストを使用すると、1 つのウェブサイトで RP ID の使用を許可する他のオリジンを指定できます。これにより、ユーザーは運営する複数のサイトで同じパスキーを再利用できます。これは、ウェブサイトと Android アプリ間でパスキーを共有する場合とは異なります。パスキーの共有では、Digital Asset Links で delegate_permission/common.handle_all_urls が使用されます。

たとえば、example.comexample.co.uk でパスキーを共有したい場合は、example.com を正規の RP ID にすることができます。これを機能させるには、example.co.uk が WebAuthn API 呼び出しで rpId: 'example.com' を使用し、example.comhttps://example.com/.well-known/webauthn にファイルをホストして example.co.uk を許可リストに登録する必要があります。

{
  "origins": [
    "https://example.co.uk"
  ]
}

これにより、example.co.ukexample.com に関連付けられたパスキーを作成して使用できます。

6. まとめ

おめでとうございます!認証情報のシームレスな共有の設定が完了しました。

ユーザーはウェブサイトでパスワードとパスキーを保存し、それをワンタップで Android アプリにログインするために使用できるようになりました(逆も同様です)。この簡単な変更で、ログインのコンバージョン率とユーザー満足度を大幅に高めることができます。

次のステップ