我知道有一堆“像字节一样的对象是必需的,而不是'str'”的问题。但我已经尝试过,没有人解决我的问题。 如果你能在我的特定情况下帮助我,那将是非常好的。
我正在使用Auth0 for django
的官方示例https://github.com/auth0-samples/auth0-django-web-app/tree/master/01-Login
我正在尝试将django 1.11与Auth0连接并在此代码中出现错误
def get_user_details(self, response):
# Obtain JWT and the keys to validate the signature
idToken = response.get('id_token')
jwks = request.urlopen("https://" + self.setting('DOMAIN') + "/.well-known/jwks.json")
issuer = "https://" + self.setting('DOMAIN') + "/"
audience = self.setting('KEY') #CLIENT_ID
payload = jwt.decode(idToken, jwks.read(), algorithms=['RS256'], audience=audience, issuer=issuer).decode('UTF-8')
我曾尝试使用 .encode('utf-8')或 b“str”或“rb”/“wb”但仍然没有运气
提前感谢您的帮助
----编辑----
使用
payload = jwt.decode(idToken, jwks.read().encode('utf-8'), algorithms=['RS256'], audience=audience, issuer=issuer).decode('UTF-8')
带我去其他错误 'bytes'对象没有属性'encode'
答案 0 :(得分:1)
jwks.read()类型为“字节”,但在jws.py中为:
如果键中有“键”
期待str的列表,以便解决此问题,将其转换为str的列表:
def get_user_details(self, response):
# Obtain JWT and the keys to validate the signature
idToken = response.get('id_token')
jwks = request.urlopen("https://" + self.setting('DOMAIN') + "/.well-known/jwks.json")
issuer = "https://" + self.setting('DOMAIN') + "/"
audience = self.setting('KEY') #CLIENT_ID
# convert to list str
jws_read = bytearray(jwks.read()).decode('ascii')
payload = jwt.decode(idToken, jws_read, algorithms=['RS256'], audience=audience, issuer=issuer)
答案 1 :(得分:0)
这是一个python 3 vs python 2问题(Auth0示例似乎是为python2.7x编写的)。
使用Auth0中的Flask示例项目时出现了类似的错误。为了解决这个问题,我修改了python-jose
库。在jws.py
的第222行,我改变了
key = json.loads(key)
来
key = json.loads(key.decode('utf-8'))
。这对我有用,我希望它适合你。
希望这会有所帮助。
我已经分开了jose包,但还没有把PR放进去。