我正在使用PyJWT
为GraphQL端点编写自定义中间件。问题是我不想保护我的登录突变。因此,我正在尝试编写中间件以排除登录突变。
通过编写GraphQL中间件很容易做到这一点,因为传递给中间件的参数使我能够检查查询的名称。
class JWTMiddleware(object):
def resolve(self, next, root, info, **args):
if info.field_name == 'login':
return next(root, info, **args
# rest of auth logic
但是因为GraphQL总是返回200
,所以我不能在客户端上使用状态代码作为我的身份验证失败检查。并且必须检查errors
数组以查看消息是Unauthorized
还是其他东西。
示例错误响应:
{
errors: [
{
message: 'Unauthorized: JWT invalid',
...,
},
...
],
data: null
}
这很好,但是我希望使用响应的状态代码作为检查,因此我决定使用自定义装饰器包装GraphQL视图。
def jwt_required(fn):
def wrapper(request):
# no access to query name, just the GraphQLString
# need function to parse the AST of a GraphQLString
graphql_string = request.body.decode('utf-8')
query_name = ast[0].name # or something like this
if query_name == 'login':
return fn(request)
# rest of auth logic
return fn(request)
return wrapper
def protected_graphql_view():
return jwt_required(GraphQLView.as_view())
urlpatterns = [
path('admin/', admin.site.urls),
path('graphiql', GraphQLView.as_view(graphiql=True)),
path('graphql', protected_graphql_view()),
path('token/refresh', refresh_token_view),
]
通过这样做,我现在可以返回带有不同状态代码的响应。但是同样的问题是,除非我可以正确解析GraphQLString,否则我无法轻易检查请求是否用于登录并跳过auth逻辑。
如果可能,我宁愿不定制产品。我认为GraphQL或Graphene会提供类似的信息。
请让我知道是否需要提供更多信息。谢谢您的帮助!