JWT身份验证:使用UI令牌验证Graphene / Django(GraphQL)查询?

时间:2016-08-10 22:32:41

标签: node.js django authentication jwt auth0

我正在开发一个具有以下架构的项目:

  • UI:通过节点服务器,Apollo Client for GraphQL对客户端和服务器端呈现进行反应,

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

我使用Auth0(基于JWT)进行前端身份验证。我想在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提出的代码。

接收并解码了我的授权标头(我可以获得有效负载),但在验证签名时出现问题:我收到“解码签名时出错。”

这很奇怪,因为我在jwt.io上测试时验证了签名。

如何在Django端进行身份验证?

2 个答案:

答案 0 :(得分:5)

我刚刚使用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的身份验证,出于开发目的,所以将其更改为以下内容。

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')),
]

答案 1 :(得分:0)

我的设置现在正在运行:

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

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的字段。