我正在使用 Jetpack Compose 为 Android 应用程序进行密钥概念验证 (PoC)。我已设置了应用程序到 Web 身份验证所需的数字资产链接 (assetlinks.json) 和域验证。尽管遵循了设置,但在尝试使用密钥时,我遇到了与 rpid 验证失败相关的错误。
我正在通过浏览器创建一个密钥,然后尝试在本机应用程序中使用它。
这是我所做的:
使用 adb shell pm get-app-links my.package.example 验证了我的域名,返回:
my.package.example:
ID: 09699a58-4970-4dd8-8f30-323c5c792297
Signatures: [CF:BF:CC:4C:AF:28:CF:82:35:F9:9D:D0:F5:C6:14:1A:AC:CF:E9:50:AA:12:25:80:E5:1D:BD:60:1E:04:21:53]
Domain verification state:
my.domain.com: 1024
这是我的assetlinks.json:
[
{
"relation": [
"delegate_permission/common.get_login_creds",
"delegate_permission/common.handle_all_urls"
],
"target": {
"namespace": "android_app",
"package_name": "my.package.example",
"sha256_cert_fingerprints": [
"CF:BF:CC:4C:AF:28:CF:82:35:F9:9D:D0:F5:C6:14:1A:AC:CF:E9:50:AA:12:25:80:E5:1D:BD:60:1E:04:21:53"
]
}
},
{
"relation": [
"delegate_permission/common.handle_all_urls",
"delegate_permission/common.get_login_creds"
],
"target": {
"namespace": "web",
"site": "https://my.domain.com"
}
}
]
我的 AndroidManifest.xml 包含一个带有 android:autoVerify="true":
的意图过滤器<intent-filter android:autoVerify="true">
<action android:name="android.intent.action.VIEW" />
<category android:name="android.intent.category.DEFAULT" />
<category android:name="android.intent.category.BROWSABLE" />
<data android:scheme="https" />
<data android:host="my.domain.com" />
</intent-filter>
域名也正确包含在字符串中:
<string name="asset_statements" translatable="false">
[{\"include\": \"https://my.domain.com/.well-known/assetlinks.json\"}]
</string>
我在 JSON 请求中传递 rpId:
val requestJson = JSONObject().apply {
put("challenge", authorizationResponse.metadata.challenge)
put("rpId", "my.domain.com")
put("allowCredentials", JSONArray())
put("timeout", 18000)
put("userVerification", "required")
}
尽管如此,我仍然收到以下错误:
rpId 验证失败
并且无法使用 pm get-app-links my.package.example 验证域
域名验证状态: my.domain.com:1024
您没有包含您的实际域名,因此我无法为您检查,但您可以查询底层服务来检查您的域名状态:
curl 'https://digitalassetlinks.googleapis.com/v1/assetlinks:check?source.web.site=https://example.com&relation=delegate_permission/common.handle_all_urls&target.android_app.package_name=PACKAGE_NAME&target.android_app.certificate.sha256_fingerprint=APK_CERTIFICATE_FINGERPRINT'
当然,请务必更换
PACKAGE_NAME
和 APK_CERTIFICATE_FINGERPRINT
。后者应该采用十六进制带冒号的格式,如上面所示。