Smart Lock for Passwords を使用するアプリがウェブサイトとユーザー データベースを共有している場合、またはアプリとウェブサイトで Google ログインなどのフェデレーション ログイン プロバイダを使用している場合は、アプリをウェブサイトに関連付けることで、ユーザーが認証情報を保存すれば、アプリとウェブサイトの両方に自動的にログインできます。
アプリをウェブサイトに関連付けるには、ウェブサイトでデジタル アセット リンクの JSON ファイルをホストし、アプリのマニフェストにデジタル アセット リンクのファイルへのリンクを追加して、関連付けを宣言します。
ウェブサイトでデジタル アセット リンクの宣言をホストすると、Android 8.0 以降で、ウェブサイトが自動入力データをアプリと共有できるようになります。
Prerequisites
ウェブサイトのログイン ドメインは、HTTPS 経由で使用できる必要があります。
アプリをウェブサイトに関連付ける
デジタル アセット リンクの JSON ファイルを作成します。
たとえば、ウェブサイト
https://signin.example.com
と、パッケージ名com.example
の Android アプリでログイン認証情報を共有できることを宣言するには、次の内容を含むファイルをassetlinks.json
という名前で作成します。[{ "relation": ["delegate_permission/common.get_login_creds"], "target": { "namespace": "web", "site": "https://signin.example.com" } }, { "relation": ["delegate_permission/common.get_login_creds"], "target": { "namespace": "android_app", "package_name": "com.example", "sha256_cert_fingerprints": [ "F2:52:4D:82:E7:1E:68:AF:8C:BC:EA:B0:A2:83:C8:FE:82:51:CF:63:09:6A:4C:64:AE:F4:43:27:20:40:D2:4B" ] } }]
relation
フィールドは、宣言されている関係を説明する 1 つ以上の文字列の配列です。アプリとサイトがログイン認証情報を共有することを宣言するには、文字列delegate_permission/common.get_login_creds
を指定します。target
フィールドは、宣言が適用されるアセットを指定するオブジェクトです。以下のフィールドでウェブサイトを識別します。namespace
web
site
ウェブサイトの URL。形式は
https://domain[:optional_port]
です(例:https://www.example.com
)。HTTPS にポート 443 を使用する場合は、domain を完全修飾名で指定し、optional_port を省略する必要があります。
site
ターゲットはルートドメインにのみできます。アプリの関連付けを特定のサブディレクトリに制限することはできません。URL の末尾にスラッシュ(末尾)などのパスを含めないでください。サブドメインは一致と見なされません。つまり、domain を
www.example.com
として指定した場合、ドメインwww.counter.example.com
はアプリに関連付けられません。次のフィールドで Android アプリを識別します。
namespace
android_app
package_name
アプリのマニフェストで宣言されているパッケージ名です。例: com.example.android
sha256_cert_fingerprints
アプリの署名証明書の SHA256 フィンガープリント。指紋を生成するには、 $ keytool -list -v -keystore my-release-key.keystore
コマンドを使用します。詳しくは、デジタル アセット リンクのリファレンスをご覧ください。
ログイン ドメインの次の場所にデジタル アセット リンクの JSON ファイルをホストする:
https://domain[:optional_port]/.well-known/assetlinks.json
たとえば、ログイン ドメインが
signin.example.com
の場合、JSON ファイルをhttps://signin.example.com/.well-known/assetlinks.json
でホストします。デジタル アセット リンクファイルの MIME タイプは JSON にする必要があります。サーバーがレスポンスで
Content-Type: application/json
ヘッダーを送信していることを確認します。ホストから Google にデジタル アセット リンク ファイルの取得が許可されていることを確認してください。
robots.txt
ファイルを使用する場合は、Googlebot エージェントが/.well-known/assetlinks.json
を取得できるようにする必要があります。ほとんどのサイトでは、自動エージェントが/.well-known/
パスのファイルを取得できるようにすることで、他のサービスがファイル内のメタデータにアクセスできるようにします。User-agent: * Allow: /.well-known/
Android アプリで関連付けを宣言します。
<application>
のマニフェスト ファイルに次の行を追加します。<meta-data android:name="asset_statements" android:resource="@string/asset_statements" />
asset_statements
文字列リソースをstrings.xml
ファイルに追加します。asset_statements
文字列は、読み込むassetlinks.json
ファイルを指定する JSON オブジェクトです。文字列で使用するアポストロフィや引用符はエスケープする必要があります。例:<string name="asset_statements" translatable="false"> [{ \"include\": \"https://signin.example.com/.well-known/assetlinks.json\" }] </string>
> GET /.well-known/assetlinks.json HTTP/1.1 > User-Agent: curl/7.35.0 > Host: signin.example.com < HTTP/1.1 200 OK < Content-Type: application/json
アプリを Google Play ストアに公開します。関連付けを取得するには、公開チャンネルでリリースする必要があります。
(省略可)Smart Lock for Passwords アフィリエーション フォームに必要事項を入力して送信し、手続きが完了したことを示します。Google は、このフォームを通じて送信された関係が実際に機能するかどうかを確認し、問題が発生した場合は問い合わせを行います。
検証が完了すると、アプリのユーザーはアプリまたはウェブサイトのいずれかに認証情報を保存し、自動的に両方にログインできます。
例: 複数のアプリをウェブサイトに関連付ける
複数のアプリをウェブサイトに関連付けるには、デジタル アセット リンク ファイルで各アプリを指定します。たとえば、com.example
アプリと com.example.pro
アプリを https://signin.example.com/
のサイトに関連付けるには、https://signin.example.com/.well-known/assetlinks.json
でホストされている JSON ファイルで両方のアプリを指定します。
[{
"relation": ["delegate_permission/common.get_login_creds"],
"target": {
"namespace": "web",
"site": "https://signin.example.com"
}
},{
"relation": ["delegate_permission/common.get_login_creds"],
"target": {
"namespace": "android_app",
"package_name": "com.example",
"sha256_cert_fingerprints": [
"F2:52:4D:82:E7:1E:68:AF:8C:BC:EA:B0:A2:83:C8:FE:82:51:CF:63:09:6A:4C:64:AE:F4:43:27:20:40:D2:4B"
]
}
},{
"relation": ["delegate_permission/common.get_login_creds"],
"target": {
"namespace": "android_app",
"package_name": "com.example.pro",
"sha256_cert_fingerprints": [
"F2:52:4D:82:E7:1E:68:AF:8C:BC:EA:B0:A2:83:C8:FE:82:51:CF:63:09:6A:4C:64:AE:F4:43:27:20:40:D2:4B"
]
}
}]
次に、両方のアプリで関連付けを宣言します。
<application>
のマニフェスト ファイルに次の行を追加します。<meta-data android:name="asset_statements" android:resource="@string/asset_statements" />
次の文字列リソースを
strings.xml
ファイルに追加します。<string name="asset_statements" translatable="false"> [{ \"include\": \"https://signin.example.com/.well-known/assetlinks.json\" }] </string>
例: アプリを複数のウェブサイトに関連付ける
デジタル アセット リンク ファイルで各ウェブサイトを指定し、各ウェブサイトでファイルをホストすることで、アプリを複数のウェブサイトに関連付けることができます。たとえば、com.example
アプリと com.example.pro
アプリを https://signin.example.com/
と https://m.example.com/
のサイトに関連付けるには、https://signin.example.com/.well-known/assetlinks.json
でホストされている JSON ファイルで、アプリと両方のサイトを指定します。
[{
"relation": ["delegate_permission/common.get_login_creds"],
"target": {
"namespace": "web",
"site": "https://signin.example.com"
}
},{
"relation": ["delegate_permission/common.get_login_creds"],
"target": {
"namespace": "web",
"site": "https://m.example.com"
},
},{
"relation": ["delegate_permission/common.get_login_creds"],
"target": {
"namespace": "android_app",
"package_name": "com.example",
"sha256_cert_fingerprints": [
"F2:52:4D:82:E7:1E:68:AF:8C:BC:EA:B0:A2:83:C8:FE:82:51:CF:63:09:6A:4C:64:AE:F4:43:27:20:40:D2:4B"
]
}
},{
"relation": ["delegate_permission/common.get_login_creds"],
"target": {
"namespace": "android_app",
"package_name": "com.example.pro",
"sha256_cert_fingerprints": [
"F2:52:4D:82:E7:1E:68:AF:8C:BC:EA:B0:A2:83:C8:FE:82:51:CF:63:09:6A:4C:64:AE:F4:43:27:20:40:D2:4B"
]
}
}]
次に、https://m.example.com/.well-known/assetlinks.json
でホストされている JSON ファイルに、主要なデジタル アセット リンク ファイルを含めます。
[{
"include": "https://signin.example.com/.well-known/assetlinks.json"
}]
最後に、両方のアプリで関連付けを宣言します。
<application>
のマニフェスト ファイルに次の行を追加します。<meta-data android:name="asset_statements" android:resource="@string/asset_statements" />
次の文字列リソースを
strings.xml
ファイルに追加します。<string name="asset_statements" translatable="false"> [{ \"include\": \"https://signin.example.com/.well-known/assetlinks.json\" }] </string>