为App Store Connect API生成令牌

时间:2019-01-21 09:53:35

标签: ruby jwt itunesconnect itunes

我需要为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解码令牌时,我的有效负载和标头已正确解码。状态:签名无效

我做错了什么?有任何想法如何正确执行吗?

2 个答案:

答案 0 :(得分:0)

我遇到了类似的身份验证错误,即 NOT_AUTHORIZED 。我按照以下步骤解决了这个问题:

1。创建Ruby脚本文件以生成有效的Bearer令牌:

参考: https://medium.com/xcblog/generating-jwt-tokens-for-app-store-connect-api-2b2693812a35

require "base64"
require "jwt"
ISSUER_ID = "YOUR_ISSUER_ID"
KEY_ID = "YOUR PRIVATE KEY ID"    // this is ID part from downloaded .p8 file name (see below for ref.)
private_key = OpenSSL::PKey.read(File.read(path_to_your_private_key/AuthKey_#{KEY_ID}.p8))   // you can enclose your file path in quotes if needed, and can pass here totally static file path (here we are reusing Key_ID variable)

token = JWT.encode(
   {
    iss: ISSUER_ID,
    exp: Time.now.to_i + 20 * 60,
    aud: "appstoreconnect-v1"
   },
   private_key,
   "ES256",
   header_fields={
       kid: KEY_ID }
)
puts token

然后在Mac上使用以下命令运行此脚本。

$ ruby jwt.rb

这将在您的终端屏幕上显示有效的Bearer令牌,您可以在下一步中使用它。

  

注释:

     
      
  • 要运行以上脚本,您需要安装ruby
  •   
  • 您将从您的开发人员帐户中复制颁发者ID。如果没有,请生成一个。
  •   
  • 确保您对经过身份验证的用户使用“ .p8”证书,这意味着您下载“ .p8”证书所使用的帐户应具有执行API级操作的权限。就我而言,我使用的是 Admin 类型的帐户。最初,我使用的是 Developer 类型的用户帐户,当我进行最后的Curl调用以获取令牌时,该帐户一直给我 Not_Authorized 错误。
  •   

2。使用令牌:

现在,我们已经了解了如何生成令牌来访问App Store Connect API,我们可以通过传递授权标头来使用它。例如获取我们可以使用的所有用户的列表

$ curl  https://api.appstoreconnect.apple.com/v1/users --Header "Authorization: Bearer lOOOOOOOOOOOONG_GENERATED_TOKEN"

这将列出App Store Connect的所有用户。请记住,我们必须在每个请求中都使用此令牌,并且每20分钟必须创建一个新令牌。

答案 1 :(得分:0)

传入的授权字符串中缺少空格。将代码修改为

后,您的代码可以正常工作

headers = { Authorization: 'Bearer ' + @token }