1

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 のドキュメントで推奨されているとおりです。

全体の構造はこれで合っていますか?この構造化を意味するこのチュートリアルに従おうとしています:

JWT 署名プロセスの概要

しかし、Apple からのこの宣伝文句:

クエリ エンドポイントと更新エンドポイントに送信する各要求には、認証キーを含む認証ヘッダーを含める必要があります。認証キーは ES256 アルゴリズムを使用し、Base 64 URL エンコードされた JSON Web トークン形式である必要があります。トークンがこの形式を使用していない場合、BAD_AUTHENTICATION_TOKEN HTTP エラーが発生します。

キーを使用して署名するのではなく、リクエストに「認証キーを含める」必要があることを示唆しています。

4

1 に答える 1