ios - 为 Apple 的 DeviceCheck API 生成 JWT
问题描述
我正在尝试使用 Apple 的 DeviceCheck API。我似乎无法制作一个不会失败的请求,因为401 Unable to verify authorization token
我尝试了一些小的变化。
import java.security.KeyFactory
import java.security.spec.PKCS8EncodedKeySpec
import java.util.Base64
import io.jsonwebtoken.{Jwts, SignatureAlgorithm}
val deviceCheckPrivateKey = "<Key in plaintext without the key-guards>"
val privateKey = KeyFactory.getInstance("EC").generatePrivate(new PKCS8EncodedKeySpec(Base64.getDecoder.decode(deviceCheckPrivateKey)))
val builder = Jwts
.builder()
.setHeaderParam("kid", "<key-id-from-file>")
.signWith(SignatureAlgorithm.ES256, privateKey)
.claim("iss", "<team-id>")
.claim("iat", System.currentTimeMillis())
println(builder.compact())
我把这个暂存文件的输出插入到这里:
curl -i -H "Authorization: Bearer <Output>" -X POST --data-binary @ValidQueryRequest.json https://api.development.devicecheck.apple.com/v1/query_two_bits
按照Apple 文档的建议。
这个整体结构对吗?我正在尝试遵循本教程,这意味着这种结构:
但苹果的这句话:
您发送到查询和更新端点的每个请求都必须包含一个包含您的身份验证密钥的授权标头。身份验证密钥必须使用 ES256 算法并采用 Base 64 URL 编码的 JSON Web 令牌格式。如果您的令牌不使用此格式,您会收到 BAD_AUTHENTICATION_TOKEN HTTP 错误。
建议我的请求应该“包含我的身份验证密钥”,而不是使用密钥签名。
解决方案
根据:https ://www.rfc-editor.org/rfc/rfc7519#section-4.1.6
val builder = Jwts
.builder()
.setHeaderParam("kid", "<key-id-from-file>")
.signWith(SignatureAlgorithm.ES256, privateKey)
.claim("iss", "<team-id>")
.claim("iat", System.currentTimeMillis()) // <--- Should be seconds, not milliseconds
推荐阅读
- sql-server - SQL SERVER:如何删除一个表中与其他表具有一对多映射的重复行
- c# - Microsoft Graph 令牌不包含权限,或权限无法理解
- java - 上传文件的验证器
- mysql - 限制选择查询的结果
- python - 如何用 python 数据框列替换现有的 SQL 数据库表列
- xml - 从 SpEL 表达式中的 .properties 文件访问属性
- c# - 从列表视图中拖动多个项目时取消选择列表项
- visual-studio-2017 - 现有项目中缺少文件 NuGet.targets
- c++ - Windows 上的 opencv wasm 构建失败
- python - 将给定数字转换为所需格式的正则表达式