如果一键登录满足您的需求,请考虑改用它。一键式更新了用户体验,并进行了其他改进。

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

如果您的使用Smart Lock for Passwords的应用程序与您的网站共享用户数据库,或者您的应用程序和网站使用联合登录提供商(例如Google Sign-In),则可以将该应用程序与网站相关联,以便用户保存其凭据一次,然后自动登录该应用程序和网站。

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

通过在网站上托管数字资产链接声明,您还可以使网站在Android 8.0及更高版本上运行时,可以与您的应用共享自动填充数据。

先决条件

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

将您的应用与您的网站相关联

  1. 创建一个数字资产链接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

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

    domain必须是完全合格的。使用端口443进行HTTPS时,必须省略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

    有关详细信息,请参见“数字资产链接”参考

  2. 在登录域上的以下位置托管Digital Assets Link 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标头。

  3. 确保您的主机允许Google检索您的Digital Asset Link文件。如果您有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. (可选)填写并提交“ 智能密码锁”从属关系表,以表明您已完成此过程。 Google会定期检查通过表单提交的从属关系是否有效,如果出现问题,可能会与您联系。

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

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

您可以通过在Digital Assets Link文件中指定每个应用程序来将多个应用程序与一个网站相关联。例如,要将com.examplecom.example.pro应用程序与位于https://signin.example.com/的网站相关联, https://signin.example.com/https://signin.example.com/.well-known/assetlinks.json托管的JSON文件中同时指定这两个应用程序https://signin.example.com/.well-known/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": "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 Assets Link文件中指定每个网站并将文件托管在每个网站上来将应用程序与多个网站相关联。例如,要将com.examplecom.example.pro应用程序与位于https://signin.example.com/https://m.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"
}]

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

  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>