如何解决Django Graphql中间件解码令牌
在我的项目中,我使用Django
和GraphQl
来构建API。用户将通过API Gateway
中的AWS
进行身份验证,并将包含在请求标头中的带有uuid JWT token
主体的username
发送到后端。
我需要解码该令牌并获取一个username
值,该值将在解析器中接下来使用。
我计划在G
中使用与Flask
对象类似的东西,或者在机架Djangos middleware中使用相似的东西,但是我在Django中却很难做到。
您有任何想法或提示吗?
解决方法
这是我实现的结果:
中间件在解析器调用之前检查jwt令牌,它基于解码后的用户名创建一个User实例,该实例在info.context.user参数中分配。 info.context将在解析器中可见。
因此,基本上在解析器中,您可以将User实例检查为:
user = info.context.user
if isinstance(user,User):
# do something
middleware.py
class AuthorizationGraphQLMiddleware:
"""Middleware add User object for each GraphQL resolver info.context"""
def resolve(self,next,root,info,**kwargs):
username = None
auth_header = info.context.META.get('HTTP_AUTHORIZATION')
if auth_header:
username = decode_token(auth_header)['username']
if username is not None:
info.context.user = User(username)
else:
info.context.user = AnonymousUser()
return next(root,**kwargs)
entities.py
@dataclass
class User:
name: str
utils.py
class TokenValidationError(GraphQLError):
pass
def decode_token(token):
try:
return jwt.decode(token.replace('Bearer ',''),verify=False)
except (jwt.DecodeError,AttributeError):
raise TokenValidationError('Invalid token.')
settings.py
GRAPHENE = {
'MIDDLEWARE': ('api.graphql.middleware.AuthorizationGraphQLMiddleware',)
}
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。