我正在尝试使用来自苹果的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 正如苹果的文档推荐的那样。
这样做的总体结构正确吗?我试图遵循本教程,这意味着这种结构:

但苹果的这段话是:
发送到查询和更新端点的每个请求都必须包括包含身份验证密钥的授权头。身份验证密钥必须使用ES256算法,并且必须采用Base64URL编码的JSON令牌格式。如果令牌不使用此格式,则会收到BAD_AUTHENTICATION_TOKEN HTTP错误。
建议不要使用密钥进行签名,我的请求应该“包含我的身份验证密钥”。
发布于 2019-06-10 14:50:20
根据: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 millisecondshttps://stackoverflow.com/questions/56498350
复制相似问题