使用Ruby为iTunes Connect API生成JWT

问题描述 投票:0回答:2

我正在尝试生成一个令牌来签署我对iTunes Connect API的请求。这是我的Ruby文件:

require "jwt"
require 'openssl'

ISSUER_ID = "my issuer string"
KEY_ID = "my key id string"

key_file = File.read('my p8 file containing my private key') # Located at the same folder than my ruby file
private_key = OpenSSL::PKey::RSA.new(key_file)

payload = {
      'iss': ISSUER_ID,
      'exp': 1528408800,
      'aud': 'appstoreconnect-v1'
  }

header = {
      'alg': 'ES256',
      'kid': KEY_ID,
      'typ': 'JWT'
  }

  jwt = JWT.encode(payload, private_key, algorithm='ES256', header)
  puts jwt

如果我运行此文件ruby jwt.rb我得到以下输出:

/Library/Ruby/Gems/2.3.0/gems/jwt-2.1.0/lib/jwt/algos/ecdsa.rb:15:in来自/ Library / Ruby /的#(NoMethodError)的'undefined方法组' Gems / 2.3.0 / gems / jwt-2.1.0 / lib / jwt / signature.rb:35:in sign'from /Library/Ruby/Gems/2.3.0/gems/jwt-2.1.0/lib/jwt /encode.rb:39:in encoded_signature'from /Library/Ruby/Gems/2.3.0/gems/jwt-2.1.0/lib/jwt/encode.rb:47:in encode_segments'from / Library / Ruby / Gems /2.3.0/gems/jwt-2.1.0/lib/jwt/encode.rb:20:in initialize'from /Library/Ruby/Gems/2.3.0/gems/jwt-2.1.0/lib/jwt。 rb:21:来自/Library/Ruby/Gems/2.3.0/gems/jwt-2.1.0/lib/jwt.rb:21:in编码'来自jwt.rb:22:in'

从控制台输出中很难分辨出什么是失败的,但如果我使用RS256作为算法并省略标题,则脚本会成功生成令牌。

ruby jwt itunesconnect
2个回答
1
投票

似乎是由于使用RSA密钥和ECDSA加密算法引起的。要么使用RS256算法而不是ES256,要么使用OpenSSL::PKey::EC而不是OpenSSL::PKey::RSA(为此你可能需要一个新的私钥)。


0
投票

Apnotic gem,它以现代Apple方式实现Apple推送通知: HTTP2.0 + JWT + p8

也许,你可以在它的ProviderToken class找到解决方案。

© www.soinside.com 2019 - 2024. All rights reserved.