我正在尝试设置一个应用程序,它使用谷歌智能锁功能来获取存储在谷歌密码管理器中的凭证并自动登录。为此,我建立了一个测试网站,用户可以登录(同时在Google Chrome浏览器中浏览),如果她选择保存该网站的密码,该密码将保存在Google的密码管理器中。我所拥有的示例应用程序应该能够自动获取存储的凭据并使用它们登录到应用程序内容页面。
我已经完全遵循了文档。以下是网站根目录下的数字资产文件:
[{
"relation": ["delegate_permission/common.get_login_creds"],
"target": {
"namespace": "web",
"site": "https://officeloginsso.azurewebsites.net"
}
},
{
"relation": ["delegate_permission/common.get_login_creds"],
"target": {
"namespace": "android_app",
"package_name": "com.mslogin.t_sopal.msloginsso",
"sha256_cert_fingerprints": [
"XX:XX:XX:XX:XX:XX:XX:XX:XX:XX:XX:XX:XX:XX:XX:XX:XX:XX:XX:XX:XX:XX:XX:XX:XX:XX:XX:XX:XX:XX:XX:XX"
]
}
},{
"relation": ["delegate_permission/common.get_login_creds"],
"target": {
"namespace": "android_app",
"package_name": "com.login.codelab.sopalsmartlock",
"sha256_cert_fingerprints": [
"XX:XX:XX:XX:XX:XX:XX:XX:XX:XX:XX:XX:XX:XX:XX:XX:XX:XX:XX:XX:XX:XX:XX:XX:XX:XX:XX:XX:XX:XX:XX:XX"
]
}
}]
包含json文件链接的Manifest文件片段:
<application>
<meta-data android:name="asset_statements" android:resource="@string/asset_statements" />
</application>
Strings.xml:
<string name="asset_statements" translatable="false">
[{
"include": "https://officeloginsso.azurewebsites.net/.well-known/assetlinks.json"
}]
</string>
应用程序已经发布(有区域限制),json文件已经托管,返回响应:
HTTP/1.1 200 OK
Content-Type: application/json
尽管做了这些,应用程序仍然不能通过网站存储用户名/密码。我是不是漏掉了什么?
根据评论中的讨论,解决方案是确保资产链接文件与已发布的Play Store应用程序的包和签名匹配,并且正在测试的apk与已发布的应用程序使用相同的证书签名(即,不是从调试/开发密钥库签名)。如果您想在发布到生产渠道之前进行测试,您可以使用alpha/beta渠道。
一般来说,以下是要检查的内容(问题中提到的一些):
-
确保你的资产链接文件是有效的json包含两个应用程序(Play Store包和证书指纹)和任何相关的登录域(桌面,移动网络,区域域等,每一个都需要它自己的资产链接。
-
检查(例如curl -I)该文件是用HTTP 200(没有重定向)从众所周知的位置(必须在确切的
/.well-known/assetlinks.json
可用)提供的"Content-Type: application/json"头,并且是可访问的机器人/爬虫 -
验证应用程序清单中的asset_statements在
application
下,并且是有效的转义的 json并指向众所周知的https位置的资产链接文件。在我们检测到这一点之前,应用程序需要发布,但你可以使用alpha/beta通道进行测试,只要apk有最新的版本代码
一旦满足这些要求并且应用程序在Play Store中发布,关联将在1-2个工作日内自动启用。这些要求的详细信息可在https://developers.google.com/identity/smartlock-passwords/android/associate-apps-and-sites
既然您已经在此路径中定义了assetlinks.json
robots.txt
文件中定义以下行非常重要:
User-agent: *
Allow: /.well-known/
允许GoogleBot访问文件:
https://officeloginsso.azurewebsites.net/.well-known/assetlinks.json阅读about robots.txt
要将密码智能锁集成到Android应用程序中,您必须在应用程序的启动和登录流程中添加对凭据API的调用。
检索凭据:
-
应用启动时,如果没有用户已登录,呼叫
CredentialsApi.request()
-
如果
getStatus().isSuccess()
返回true,使用getCredential()
获取用户的凭据并使用它们登录 -
如果
getStatus().isSuccess()
返回false,getStatusCode()
返回RESOLUTION_REQUIRED
,则需要用户输入以选择凭据。调用startResolutionForResult()
提示用户选择保存的账号,然后调用getParcelableExtra(Credential.EXTRA_KEY)
获取用户的凭据并使用凭据登录。
注意:如果检索到的凭据登录失败,因为密码不正确或帐户不存在,从智能锁删除凭据。
本文档展示了如何将密码智能锁集成到Android应用程序中。