我需要为Store Connect API生成JWT标记。我正在尝试使用jwt ruby gem ruby-jwt。这是我的标记生成代码,
payload = {
'iss': my_issuer_id_from_db,
'exp': generated_unix_timestamp, #Time.now + 20min
'aud': 'hard_coded_string_from_doc'
}
header = {
'alg': 'ES256',
'kid': my_key_id_from_db,
'typ': 'JWT'
}
private_key = OpenSSL::PKey.read(File.read('/tmp/private_key.pem'))
# private_key - <OpenSSL::PKey::EC:0x000000000XXXXXXX>
@token = JWT.encode(payload, private_key, 'ES256', header)
# encoded_header.encoded_payload.emcoded_signature
我将此令牌放入请求的标题中:
headers = { Authorization: 'Bearer' + @token }
我收到答复如下:
"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"
}]
}
我认为问题出在令牌上(直接使用签名)。当我尝试使用online tool解码令牌时,我的有效负载和报头被正确解码。状态:无效签名
我做错了什么?知道怎么做才合适吗?
4条答案
按热度按时间7d7tgy0s1#
我遇到了类似的身份验证错误,即 NOT_AUTHORIZED。我通过以下步骤解决了该错误:
1.创建Ruby脚本文件以生成有效的
Bearer
令牌:然后在Mac上使用以下命令运行此脚本。
$ ruby jwt.rb
这将在您的终端屏幕上显示一个有效的
Bearer
令牌,您可以在下一步中使用它。ruby
。2.使用令牌:
现在,我们已经了解了如何生成令牌来访问App Store Connect API,我们可以通过传递授权头来使用它。例如,获取我们可以使用的所有用户的列表
这将列出App Store Connect的所有用户。请记住,我们必须在每次请求时使用此令牌,并且我们必须每隔20分钟创建一个新令牌。
gc0ot86w2#
传入的授权字符串中缺少空格。将代码修改为后,代码工作正常
headers = { Authorization: 'Bearer ' + @token }
hzbexzde3#
我刚刚在这里创建了python3版本。
401 Authentication credentials are missing or invalid
可能与获取时间issued
或expired
有关。检查你的函数获取时间是苹果推荐的
UNIX epoch time
。w6mmgewl4#
我有一个2023年的答案,它利用了@Nah的答案中的Ruby脚本,但对我来说很有效,因为它添加了一些旧答案中缺少的键。
Ruby脚本:
然后,您可以在与Apple通信时将该密钥放在
Authorization
标头中。例如,我需要从Apple获得应用内购买事件的测试通知,这样我就可以将令牌放在curl请求中并获得200:
如果希望使用Postman,请在
Authorization
选项卡中,将Ruby脚本生成的标记设置为Bearer Token
。