Генерация JWT для Apple DeviceCheck API - PullRequest
0 голосов
/ 07 июня 2019

Я пытаюсь использовать API DeviceCheck от Apple.Кажется, я не могу составить запрос, который не выходит из строя с 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 .

Является ли общая структура этого права?Я пытаюсь следовать этому уроку , который подразумевает это структурирование:

Overview of JWT signing process

Но эта реклама от Apple:

Каждый запрос, который вы отправляете на запрос и обновляете конечные точки, должен содержать заголовок авторизации, который содержит ваш ключ аутентификации.Ключ аутентификации должен использовать алгоритм ES256 и быть в формате Web-токена JSON в кодировке Base 64 URL.Если ваш токен не использует этот формат, вы получите ошибку HTTP BAD_AUTHENTICATION_TOKEN.

Предполагается, что вместо подписи с использованием ключа мой запрос должен "содержать мой ключ аутентификации".

1 Ответ

0 голосов
/ 10 июня 2019

Согласно: 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
...