我正在构建一个烧瓶 API,它将操纵要在 thingsboard 中使用的数据。
长话短说,客户通过 thingsboard 登录,从中获取 jwt。
但是 API 拒绝 jwt 说签名验证失败。
双方都使用相同的密钥。
两个thingboard都在远程服务器上,API目前在开发过程中是本地的。
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
flask-jwt-extended 的 3.21.0 版添加了一个JWT_DECODE_ISSUER
可以为您解决此问题的选项:https ://github.com/vimalloc/flask-jwt-extended/releases/tag/3.21.0