JSON Web令牌无法解码

时间:2018-10-18 22:06:51

标签: ruby python-3.x jwt github-api pyjwt

我试图将GitHub Apps示例入门代码从Ruby移植到Python,但是在生成所需的JWT时遇到了麻烦。 Ruby script看起来像这样,并且工作正常:

require 'openssl'
require 'jwt'  # https://rubygems.org/gems/jwt

private_pem = File.read(YOUR_PATH_TO_PEM)
private_key = OpenSSL::PKey::RSA.new(private_pem)

payload = {
  iat: Time.now.to_i,
  exp: Time.now.to_i + (10 * 60),
  iss: GITHUB_APP_IDENTIFIER
}

jwt = JWT.encode(payload, private_key, "RS256")
puts jwt

我的Python脚本如下,当与GitHub API一起使用时,会产生A JSON web token could not be decoded错误:

import os
import time
import jwt

APP_IDENTIFIER = os.environ["GITHUB_APP_IDENTIFIER"]

with open('./PRIVATE_KEY.pem', 'r') as f:
    PRIVATE_KEY = f.read()

payload = {"iat": int(time.time()),
           "exp": int(time.time()) + (10*60),
           "iss": APP_IDENTIFIER}

print(jwt.encode(payload, PRIVATE_KEY, algorithm='RS256'))

当我尝试从两个脚本中打印私钥时,我发现Ruby版本有一个额外的换行符。我尝试将其添加到Python脚本的私钥中,但没有改变输出。

我最好的猜测是,差异与OpenSSL::PKey::RSA.new调用有关,但是我不确定这对键有什么作用。

1 个答案:

答案 0 :(得分:1)

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

>>> a = b'hello'
>>> str(a)
"b'hello'"

在Python 3中将字节转换为字符串的正确方法是使用:

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

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