无法使用 JWT 令牌连接到 Apple App Store API

Posted

技术标签:

【中文标题】无法使用 JWT 令牌连接到 Apple App Store API【英文标题】:Unable to connect to Apple App Store API with JWT token 【发布时间】:2021-03-18 13:56:48 【问题描述】:

我需要为 Store Connect API 生成 JWT 令牌。这是我的令牌生成代码,

console.log("???? appStoreConnectAPIFromNode.js running ????‍")

const fs   = require('fs');
const jwt  = require('jsonwebtoken'); // npm i jsonwebtoken
// You get privateKey, apiKeyId and issuerId from your Apple App Store Connect account
const privateKey = fs.readFileSync("./AuthKey-XXXXXXXX.p8") // this is the file you can only download once and should treat like a real, very precious key.
const apiKeyId = "XXXXXXXX"
const issuerId = "XXXXXXXX-XXXX-XXXX-XXX-XXXXXXXXXX"
let now = Math.round((new Date()).getTime() / 1000); // Notice the /1000 
let nowPlus20 = now + 1199 // 1200 === 20 minutes

let payload = 
    "iss": issuerId,
    "exp": nowPlus20,
    "aud": "appstoreconnect-v1",
    "iat": now


let signOptions = 
    "algorithm": "ES256", // you must use this algorythm, not jsonwebtoken's default
    header : 
        "alg": "ES256",
        "kid": apiKeyId,
        "typ": "JWT"
    
;

let token = jwt.sign(payload, privateKey, signOptions);
console.log('@token: ', token);

fs.writeFile('Output.txt', token, (err) =>  
      
    // In case of a error throw err. 
    if (err) throw err; 
)

我收到了这个回复

 "errors": [
                "status": "401",
                "code": "NOT_AUTHORIZED",
                "title": "Authentication credentials are missing or invalid.",
                "detail": "Provide a properly configured and signed bearer token, and make sure that it has not expired. Learn more about Generating Tokens for API Requests https://developer.apple.com/go/?id=api-generating-tokens"
        ]

我认为问题在于令牌(直接带有签名)。当我尝试在https://jwt.io/#debugger-io 上解码令牌时,我的有效负载和标头已正确解码。状态:无效签名

我做错了什么?任何想法如何正确地做到这一点?

【问题讨论】:

您是否将公钥粘贴到 jwt.io?没有公钥,它无法验证签名。但错误消息是“身份验证凭据丢失或无效”。您是否在标头中发送了令牌? 是的,生成令牌后我运行这个命令:: curl api.appstoreconnect.apple.com/v1/apps --Header "Authorization: Bearer lOOOOOOOOOOOONG_GENERATED_TOKEN" 【参考方案1】:

根据jsonwebtokenusage的说明。您可以直接在空负载上使用options,如下所示:

let signOptions = 
    issuer: issuerId,
    keyid: apiKeyId,
    expiresIn: '20m',
    audience: 'appstoreconnect-v1',
    algorithm: 'ES256'
;

let token = jwt.sign(, privateKey, signOptions);

【讨论】:

尝试上述示例后仍然收到相同的错误消息 奇怪。我假设您肯定“issuerId”和“apiKeyId”都是正确的。只剩下 2 项检查: 1. 您的环境日期/时间实际上是正确的。这么简单的事情可能就是原因,因为签名的令牌有一个计算的到期时间。 2. 您已在您的开发者帐户中签署并批准了 Apple“付费协议”。即使在测试期间,这些都是 Apple 要求的。

以上是关于无法使用 JWT 令牌连接到 Apple App Store API的主要内容,如果未能解决你的问题,请参考以下文章

连接到 Web 服务 - 令牌提供者无法获取目标令牌

如何从使用 JWT 令牌的 Web 客户端应用程序中注销用户

在 000webhost 上托管时无法使用 jwt 连接到 laravel api

JWT 令牌签名验证 javascript

未从 ADFS 3.0 获取用于 OAuth2 访问令牌的 JWT 中的用户身份

验证 JWT 令牌签名