JWT身份validation:使用UI令牌来validation石墨烯/ Django(GraphQL)查询?

我正在研究一个具有以下架构的项目:

  • 用户界面(UI):通过节点服务器,用于GraphQL的Apollo客户端进行客户端和服务器端渲染,

  • API:Django通过Graphene处理GraphQL查询。

我使用Auth0(基于JWT)进行前端身份validation。 我想使用我得到的令牌来validation我的用户在GraphQL查询API方面的上下文。

[EDIT2]

要将令牌传递给我的API,我使用:

const idToken = cookie.load('idToken') || null; networkInterface.use([{ applyMiddleware(req, next) { if (!req.options.headers) { req.options.headers = {}; // Create the header object if needed. } req.options.headers.authorization = `Bearer ${idToken}`; next(); } }]); 

然后我需要在Django中检索它:我使用django-jwt-auth和由@Craig Ambrose提出的代码。

我的授权头被接收和解码(我可以得到有效载荷),但validation签名时出现问题:我得到“错误解码签名”。

这是奇怪的,因为签名被validation,当我在jwt.io上testing它。

我怎样才能在Django身份validation?

我刚刚使用django-jwt-auth(不使用Auth0)

例如,该包提供了一个JSONWebTokenAuthMixin,您可以将它与来自graphene_django的GraphQLView结合使用。

 from jwt_auth.mixins import JSONWebTokenAuthMixin class AuthGraphQLView(JSONWebTokenAuthMixin, GraphQLView): pass urlpatterns = [ url(r'^graphql', csrf_exempt(AuthGraphQLView.as_view(schema=schema))), url(r'^graphiql', include('django_graphiql.urls')), ] 

这工作,但我发现graphiql停止工作,因为它不是发送到令牌。 我想继续使用基于cookie的validation,为了开发的目的,所以改变了以下。

 from jwt_auth.mixins import JSONWebTokenAuthMixin class OptionalJWTMixin(JSONWebTokenAuthMixin): def dispatch(self, request, *args, **kwargs): auth = get_authorization_header(request) if auth: return super(OptionalJWTMixin, self).dispatch(request, *args, **kwargs) else: return super(JSONWebTokenAuthMixin, self).dispatch(request, *args, **kwargs) class AuthGraphQLView(OptionalJWTMixin, GraphQLView): pass urlpatterns = [ url(r'^graphql', csrf_exempt(AuthGraphQLView.as_view(schema=schema))), url(r'^graphiql', include('django_graphiql.urls')), ] 

我的设置正在工作:

我使用了@Craig Ambrose的代码和django-jwt-auth。 我不得不在Github上分发包来处理Auth0令牌中的Audience'aud'有效载荷。

 def jwt_get_user_id_from_payload_handler(payload): sub = payload.get('sub') Auth0User = import_string('project.models.Auth0User') auth0_user = Auth0User.objects.filter(auth0_id=sub)[0] user_id = auth0_user.user.id return user_id JWT_PAYLOAD_GET_USER_ID_HANDLER = jwt_get_user_id_from_payload_handler auth0_key = '<MyAuth0SECRET>' JWT_SECRET_KEY = base64.b64decode(auth0_key.replace("_","/").replace("-","+")) JWT_VERIFY = True JWT_AUTH_HEADER_PREFIX = 'Bearer' JWT_AUDIENCE = '<MyAuth0CLIENT_ID>' 

Aut0User是一个与传统Django用户的OnoToOne关系模型,以及一个auth0_id字段。