Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/python-3.x/15.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ruby 无法解码JSON web令牌_Ruby_Python 3.x_Jwt_Github Api_Pyjwt - Fatal编程技术网

Ruby 无法解码JSON web令牌

Ruby 无法解码JSON web令牌,ruby,python-3.x,jwt,github-api,pyjwt,Ruby,Python 3.x,Jwt,Github Api,Pyjwt,我试图将GitHub应用程序示例启动程序代码从Ruby移植到Python,但在生成所需的JWT时遇到了麻烦。该选项如下所示,并且工作正常: 需要“openssl” 需要“jwt”#https://rubygems.org/gems/jwt private\u pem=File.read(到\u pem的\u路径) private_key=OpenSSL::PKey::RSA.new(private_pem) 有效载荷={ iat:时间到了, exp:Time.now.to_i+(10*60),

我试图将GitHub应用程序示例启动程序代码从Ruby移植到Python,但在生成所需的JWT时遇到了麻烦。该选项如下所示,并且工作正常:

需要“openssl”
需要“jwt”#https://rubygems.org/gems/jwt
private\u pem=File.read(到\u pem的\u路径)
private_key=OpenSSL::PKey::RSA.new(private_pem)
有效载荷={
iat:时间到了,
exp:Time.now.to_i+(10*60),
iss:GITHUB\u应用程序\u标识符
}
jwt=jwt.encode(有效载荷,私钥,“RS256”)
放置jwt
我的Python脚本如下所示,在针对GitHub API使用时,会产生JSON web令牌无法解码的
错误:

导入操作系统
导入时间
进口jwt
APP\u IDENTIFIER=os.environ[“GITHUB\u APP\u IDENTIFIER”]
将open('./PRIVATE_KEY.pem',r')作为f:
私钥=f.read()
有效载荷={“iat”:int(time.time()),
“exp”:int(time.time())+(10*60),
“iss”:应用程序标识符}
打印(jwt.encode(有效负载、私钥、算法='RS256'))
当我尝试从两个脚本打印私钥时,我发现Ruby版本有一个额外的换行符。我尝试将其添加到Python脚本中的私钥中,但没有改变输出

我的最佳猜测是,差异与
OpenSSL::PKey::RSA.new
调用有关,但我不确定这对密钥有什么影响。

jwt.encode()
将在Python 3中返回字节,这可能会在发送管道中的某个位置调用
str()
。在Python 3中对bytes对象调用
str()
,可能会导致潜在的意外行为:

>>> a = b'hello'
>>> str(a)
"b'hello'"
在Python 3中,将字节转换为字符串的正确方法是使用:

>>> a.decode('utf-8')
'hello'

我在我的
jwt.encode
行的末尾添加了对
decode
的调用,API对jwt的解码突然没有问题。

你可能会发现jwt.io上的在线调试器有助于比较两个生成的令牌。索赔是否匹配(直到时间戳)?它能根据您的公钥验证签名吗?