python - 如何使用来自不同发行者的 jwt?
问题描述
我正在构建一个烧瓶 API,它将操纵要在 thingsboard 中使用的数据。
长话短说,客户通过 thingsboard 登录,从中获取 jwt。
但是 API 拒绝 jwt 说签名验证失败。
双方都使用相同的密钥。
两个thingboard都在远程服务器上,API目前在开发过程中是本地的。
jwt 操作新手,我错过了什么?
解决方案
确保JWT_AUTH_USERNAME_KEY
与库用于获取用户的用户名相匹配。例如,当您获得 Thingsboard JWT 时,用户名在sub
密钥中,许多库username
默认使用。
也许这段代码可以帮助你(使用 JWT Rest Framework 实现:
class CustomAuth(JSONWebTokenAuthentication):
def authenticate_credentials(self, payload):
"""
Returns an active user that matches the payload's user id and email.
"""
User = get_user_model()
# Thingsboard payload
if payload.get('sub') is not None:
username = payload.get('sub')
else:
# Our payload
username = payload.get('username')
if not username:
msg = _('Invalid payload.')
raise exceptions.AuthenticationFailed(msg)
try:
user = User.objects.get_by_natural_key(username)
except User.DoesNotExist:
msg = _('Invalid signature.')
raise exceptions.AuthenticationFailed(msg)
if not user.is_active:
msg = _('User account is disabled.')
raise exceptions.AuthenticationFailed(msg)
return user
推荐阅读
- python - 在 Plotly Dash 图表中放置刻度标签 - Python
- javascript - 从子对象中获取多个ID
- node.js - 纠正和统一解构列表的类型
- c# - 带有构造函数参数的 RegisterSingleton
- github - 用户在 github 成立前加入 github
- excel - Excel VBA 中的日期字符串操作
- angular-material - 删除项目时未发出 cdkDropListDropped 事件
- python - Python获取包含子字符串的列表列表中的列表索引
- amazon-web-services - 在 AWS EMR 上运行 docker 映像?
- gradle - Gradle 版本目录和 JavaFX