设置跨网站和 Android 应用的无缝凭证共享

1. 概览

您的用户是否通过网站和 Android 应用访问您的服务?如果他们必须在每个平台上单独登录,就会产生不必要的摩擦,并可能导致用户流失。

Digital Asset Links (DAL) 通过允许您声明网站与应用之间的关联来解决此问题。这样,密码管理工具(如 Google 密码管理工具)就可以在网站和应用之间共享已保存的密码和通行密钥。

具体来说,配置 Digital Asset Links 文件需要不同的关系,具体取决于您要共享的内容:

  • 对于密码:包含 delegate_permission/common.get_login_creds 可让密码管理工具在您的网站和应用之间共享已保存的密码。
  • 对于通行密钥:由于通行密钥严格绑定到特定网域,因此 Android 需要网域所有权证明。因此,您必须包含 delegate_permission/common.handle_all_urls。您可能知道这是用于 Android 应用链接(深层链接)的权限,但它也是一项严格要求,即允许在一个平台上创建的通行密钥在另一个平台上使用。

效果如何呢?用户可以使用为其中一个平台保存的密码或通行密钥,在您的关联平台上顺畅登录。

可在不同媒体资源中使用的密码

实现无缝凭证共享可以显著提升用户体验。例如,eBay 在实现 DAL 以进行凭据共享后,登录成功率提高了 10%

在此 Codelab 中,您将学习如何使用 Digital Asset Links 在您的网站和 Android 应用之间启用凭据共享。

前提条件

学习内容

  • 如何使用 Google Play 管理中心设置凭据共享(推荐)。
  • 如何手动创建 assetlinks.json 文件。
  • 如何配置 Android 应用以进行手动关联。
  • 如何通过将 Android 应用与网站网域相关联,在该应用上启用通行密钥。
  • 如何使用工具生成和验证您的设置。

所需条件

  • 网站:能够在 https://{your-domain}/.well-known/assetlinks.json 托管 JSON 文件。
  • Android 应用
    • 对于 Play 管理中心方法:在 Google Play 上发布的应用。
    • 对于手动方法:您可以修改和构建的 Android 项目。请注意,如需让 Google 密码管理工具能够共享凭据,应用必须在 Google Play 上发布。

运作方式

如需让凭据共享正常运行,您需要建立双向信任:

  1. 网站 -> 应用:您的网站必须托管一个 assetlinks.json 文件,声明它信任您的 Android 应用。
  2. 应用 -> 网站:您的 Android 应用必须配置为信任您的网站。

我们将介绍两种方法:使用 Google Play 管理中心的自动方法 (推荐)和直接使用 Digital Asset Links 的手动方法

2. 使用 Google Play 管理中心进行设置(推荐)

在您的网站和 Android 应用之间启用凭据共享的最简单 方法是使用 Google Play 管理中心。使用此方法,您可以将应用与网站相关联,而无需修改应用的清单或发布新版本的应用。Google Play 会为您管理应用端关联。

前提条件

  • Play 管理中心权限,可访问深层链接 页面
  • 能够在您的网域上发布 /.well-known/assetlinks.json 文件。

如需详细了解深层链接,请参阅 Android 应用链接

步骤

  1. Play 管理中心 内,依次前往 拓展 > 深层链接
  2. 如果您的网域未列出,请点击应用配置 下的添加网域
  3. 找到您的网域,然后找到凭据共享 列。点击开启 (或确保为新网域启用启用凭据共享 )。
  4. 复制 Play 管理中心生成的 JSON 代码段。
  5. 将此 JSON 内容发布到 https://{your-domain}/.well-known/assetlinks.json。(如果您已有此文件,请将新语句附加到该文件)。
  6. 返回 Play 管理中心,点击创建网站关联开启凭据共享

Play 管理中心现在将验证您的托管设置。

Play 管理中心深层链接

如需让凭据共享正常运行,您的网站主机必须满足以下要求:

  • 网址可通过 HTTPS 访问。
  • 服务器响应 Content-Type: application/json
  • 网址可直接访问,而无需重定向。

验证通过后,凭据共享功能即会启用!配置更改可能需要 1-2 周才能传播。

3. 使用 Digital Asset Links 手动设置

需要更多控制权?或者无法访问 Play 管理中心?您可以手动配置网站与 Android 应用之间的凭据共享。这涉及两项主要任务:在您的网站上托管 JSON 文件,以及更新 Android 应用清单。

1. 获取应用的数字指纹

在设置无缝凭证共享之前,请确保您拥有每个平台的以下信息:

对于每个 Android 应用:

2. 创建关联文件

您需要创建一个 assetlinks.json 文件,用于声明网站与应用之间的关系。使用 delegate_permission/common.get_login_creds 授予共享密码的权限,并使用 delegate_permission/common.handle_all_urls 启用深层链接并共享通行密钥。

创建一个名为 assetlinks.json 的文件,其中包含以下内容。 示例值替换为您自己的网站网址、软件包名称和指纹:

[{
  "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

如需让凭据共享正常运行,您的网站主机必须满足以下要求:

  • 网址可通过 HTTPS 访问。
  • 服务器响应 Content-Type: application/json
  • 网址可直接访问,而无需重定向。

从网站到应用

4. 配置 Android 应用

现在,让您的 Android 应用信任该网站。您将在清单中添加一个引用,指向包含 assetlinks.json 网址的资源文件。

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. 验证您的设置

在发布之前,务必验证您的 Digital Asset Links 配置。不正确的 JSON 或无法访问的文件将静默失败。

使用官方的 语句生成器和验证器 工具。

对账单生成器和验证器

  1. 输入您的网站网域应用包名称
  2. 点击测试语句
  3. 该工具将检查 assetlinks.json 文件是否托管正确,以及是否包含有效的关联。

5. 在多个网站之间共享凭据

从网站到应用

如果您有多个网站共享同一登录系统(例如 example.comexample.co.uk),您可以将它们声明为关联网站,以便在它们之间共享凭据。

在多个网站之间共享密码

如需在网站之间共享密码,您可以使用 delegate_permission/common.get_login_creds 声明 web-to-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,请参阅了解 Relying Party ID (RP ID)。借助相关源请求,一个网站可以指定允许使用其 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.com 必须在 https://example.com/.well-known/webauthn 托管一个文件,以将 example.co.uk 列入许可名单:

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

这样,example.co.uk 就可以创建和使用与 example.com 关联的通行密钥。

6. 总结

恭喜!您已成功设置无缝凭证共享。

现在,您的用户可以在您的网站上保存密码和通行密钥,然后只需点按一下即可使用该密码和通行密钥登录您的 Android 应用(反之亦然)。这项简单的更改可以显著提高您的登录转化率和用户满意度。

接下来怎么做?