为Apple的DeviceCheck API生成JWT

时间:2019-06-07 16:47:14

标签: ios scala jwt jjwt devicecheck

我正在尝试使用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's documentation的建议。

这是整体结构吗?我正在尝试遵循this tutorial,这暗示了这种结构:

Overview of JWT signing process

但是来自苹果公司的这句话:

  

您发送给查询和更新终结点的每个请求都必须包含一个包含验证密钥的授权标头。身份验证密钥必须使用ES256算法,并且采用Base 64 URL编码的JSON Web令牌格式。如果您的令牌未使用此格式,则会收到BAD_AUTHENTICATION_TOKEN HTTP错误。

建议我的请求应该“包含我的身份验证密钥”,而不是使用密钥进行签名。

1 个答案:

答案 0 :(得分:0)

根据:https://tools.ietf.org/html/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