跨应用和网站启用自动登录

如果您的应用使用 Smart Lock(密码专用)与网站共享用户数据库,或者您的应用和网站使用联合登录提供方(例如 Google 登录),您可以将应用与网站相关联,这样用户只需保存一次凭据,即可自动登录应用和网站。

如需将应用与网站相关联,请通过在网站上托管 Digital Asset Links JSON 文件,并将指向 Digital Asset Link 文件的链接添加到应用的清单中,来声明关联性。

通过在您的网站上托管 Digital Asset Links 声明,您还可以让网站在 Android 8.0 及更高版本上运行时与应用共享自动填充数据。

前提条件

您网站的登录网域必须可通过 HTTPS 获得。

将应用与网站相关联

  1. 创建一个 Digital Asset Links 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 字段是包含一个或多个字符串的数组,用于描述所声明的关系。如需声明应用和网站可共享登录凭据,请指定字符串 delegate_permission/common.get_login_creds

    target 字段是一个对象,用于指定声明所适用的资源。以下字段用于标识网站:

    namespace web
    site

    网站的网址,格式为 https://domain[:optional_port],例如 https://www.example.com

    domain 必须是完全限定的,在为 HTTPS 使用端口 443 时必须省略 optional_port

    site 目标只能是根网域:您不能将应用限制为仅与特定子目录相关联。请勿在网址中包含路径,例如尾部斜杠。

    子网域不会被视为匹配,也就是说,如果您将 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

    如需了解详情,请参阅 Digital Asset Links 参考文档

  2. 将这个 Digital Asset Links JSON 文件托管在登录网域中的以下位置:

    https://domain[:optional_port]/.well-known/assetlinks.json

    例如,如果您的登录网域是 signin.example.com,请将 JSON 文件托管在 https://signin.example.com/.well-known/assetlinks.json 上。

    Digital Asset Links 文件的 MIME 类型需为 JSON。确保服务器在响应中发送 Content-Type: application/json 标头。

  3. 确保您的主机允许 Google 检索您的 Digital Asset Links 文件。如果您有 robots.txt 文件,它必须允许 Googlebot 代理检索 /.well-known/assetlinks.json。大多数网站可以直接允许任何自动化代理检索 /.well-known/ 路径下的文件,以便其他服务可以访问这些文件中的元数据:

    User-agent: *
    Allow: /.well-known/
    

  4. 在 Android 应用中声明关联。

    1. 将以下代码行添加到清单文件中的 <application> 下:

        <meta-data android:name="asset_statements" android:resource="@string/asset_statements" />
      
    2. asset_statements 字符串资源添加到 strings.xml 文件中。asset_statements 字符串是一个 JSON 对象,用于指定要加载的 assetlinks.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
      
  5. 将应用发布到 Google Play 商店。需要在公开渠道中发布相关信息,才能吸引用户建立关联

  6. (可选)填写并提交 Smart Lock(密码专用)关联表单,表明您已完成该流程。Google 会定期检查通过该表单提交的关联商户是否确实能正常使用,如果出现问题,Google 可能会与您联系。

验证完成后,您应用的用户可以将其凭据保存到您的应用或网站上,并自动登录两者。

示例:将多个应用与一个网站相关联

通过在 Digital Asset Links 文件中指定每个应用,您可以将多个应用与一个网站相关联。例如,如需将 com.examplecom.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"
    ]
  }
}]

然后,在这两个应用中声明关联:

  1. 将以下代码行添加到清单文件中的 <application> 下:

    <meta-data android:name="asset_statements" android:resource="@string/asset_statements" />
    
  2. 将以下字符串资源添加到 strings.xml 文件中:

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

示例:将应用与多个网站相关联

通过在 Digital Asset Links 文件中指定每个网站并在每个网站上托管该文件,您可以将应用与多个网站相关联。例如,如需将 com.examplecom.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 文件中,添加主 Digital Asset Links 文件:

[{
  "include": "https://signin.example.com/.well-known/assetlinks.json"
}]

最后,在这两个应用中声明关联:

  1. 将以下代码行添加到清单文件中的 <application> 下:

    <meta-data android:name="asset_statements" android:resource="@string/asset_statements" />
    
  2. 将以下字符串资源添加到 strings.xml 文件中:

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