Authlib jwt令牌解码在函数内部不起作用

时间:2018-11-19 14:41:06

标签: python authentication jwt access-token authlib

我正在使用authlib库来解码JWT令牌。

当我按原样运行时,此代码工作正常。

from authlib.specs.rfc7519 import jwt
encoded_jwt = '''eyJ0eXAiOiJKV1Qi.....'''
secret = b'''-----BEGIN PUBLIC KEY-----
.....
-----END PUBLIC KEY-----'''

claims = jwt.decode(encoded_jwt, secret)
print(type(claims))
import json

json_parse = json.loads(json.dumps(claims))
email = json_parse['http://wso2.org/claims/emailaddress']
print(email)
roles = json_parse['http://wso2.org/claims/role']
print(roles)
email, roles[-1]

但是当我将其添加到函数中时,它不起作用。由于这个问题,我无法在FLASK框架中使用它。下面的代码不起作用。请不要回答检查公钥,因为上面的代码可以正常工作。

def getsessions():
    from authlib.specs.rfc7519 import jwt
    encoded_jwt = '''eyJ0eXAiOiJ....'''
    secret = b'''-----BEGIN PUBLIC KEY-----
    ............
    -----END PUBLIC KEY-----'''

    claims = jwt.decode(encoded_jwt, secret)
    print(type(claims))
    import json

    json_parse = json.loads(json.dumps(claims))
    email = json_parse['http://wso2.org/claims/emailaddress']
    print(email)
    roles = json_parse['http://wso2.org/claims/role']
    print(roles)
    email, roles[-1]

email,role=getsessions()

print(email)

我得到的错误是:

  

回溯(最近通话最近):文件   “ /home/sathiyakugan/PycharmProjects/JWTsample/ss.py”,第50行,在          email,role = getsessions()文件“ /home/sathiyakugan/PycharmProjects/JWTsample/ss.py”,第39行,在   获取会话       Claims = jwt.decode(encoded_jwt,秘密)文件“ /home/sathiyakugan/PycharmProjects/Python/venv/lib/python3.5/site-packages/authlib/specs/rfc7519/jwt.py”,   第119行,在解码中       数据= self._jws.deserialize_compact(s,key_func,decode_payload)文件   “ /home/sathiyakugan/PycharmProjects/Python/venv/lib/python3.5/site-packages/authlib/specs/rfc7515/jws.py”,   第108行,在deserialize_compact中       self._algorithms,jws_header,payload,key)文件“ /home/sathiyakugan/PycharmProjects/Python/venv/lib/python3.5/site-packages/authlib/specs/rfc7515/util.py”,   第14行,在prepare_algorithm_key中       密钥= algorithm.prepare_public_key(密钥)文件“ /home/sathiyakugan/PycharmProjects/Python/venv/lib/python3.5/site-packages/authlib/specs/rfc7518/_backends/_key_cryptography.py”,   第28行,在prepare_public_key中       return load_pem_public_key(key,backend = default_backend())文件“ /home/sathiyakugan/PycharmProjects/Python/venv/lib/python3.5/site-packages/cryptography/hazmat/primitives/serialization.py”,   第24行,在load_pem_public_key中       返回backend.load_pem_public_key(data)文件“ /home/sathiyakugan/PycharmProjects/Python/venv/lib/python3.5/site-packages/cryptography/hazmat/backends/openssl/backend.py”,   第1040行,在load_pem_public_key中       self._handle_key_loading_error()文件“ /home/sathiyakugan/PycharmProjects/Python/venv/lib/python3.5/site-packages/cryptography/hazmat/backends/openssl/backend.py”,   第1291行,_handle_key_loading_error中       引发ValueError(“无法反序列化关键数据。”)ValueError:无法反序列化关键数据。

请帮助我我哪里做错了。我一直在努力解决这个问题长达2天。请帮忙。

1 个答案:

答案 0 :(得分:1)

在该函数中,secret字符串中有一个缩进,这会导致PUBLIC_KEY变成无效键,因为缩进不好。关键在您的函数中将是这样的

abcdadgadgadsgasdgasdg
    adgadgadg
    adgagadgadsg

您可以将secret保存到名为public_key.pem的文件中,然后从该文件中读取数据。