node.js - JWT 认证 : Use UI token to authenticate Graphene/Django (GraphQL) queries?

标签 node.js django authentication jwt auth0

我正在从事一个具有以下架构的项目:

  • UI:通过 Node 服务器、Apollo Client for GraphQL 在客户端和服务器端呈现 React,

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

我使用 Auth0(基于 JWT)进行前端身份验证。我想使用我获得的 token 在 GraphQL 查询 API 端的上下文中对我的用户进行身份验证。

[编辑2]

为了将 token 传递到我的 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 提出的代码。

我的授权 header 已接收并解码(我可以获取有效负载)但验证签名时出现问题:我收到“错误解码签名”。

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

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

最佳答案

我刚刚使用 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 停止工作,因为它没有发送到 token 。出于开发目的,我想为此继续使用基于 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')),
]

关于node.js - JWT 认证 : Use UI token to authenticate Graphene/Django (GraphQL) queries?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38884611/

相关文章:

javascript - forEach 未处理的拒绝错误

node.js - 任何人都可以向我解释 socket.io/nodejs 中的 "volatile"消息吗?

node.js - 使用 npm 模块 activedirectory 时出错 : "TypeError: activedirectory is not a constructor"

python - Docker 上的 Redis : Error 111 connecting to 0. 0.0.0 :6379. 连接被拒绝

python - 更改了 Django 模型属性,现在出现错误

swift - 观察者的完成处理程序未调用,如何检查代码

node.js - 使用 Protractor webdriver-manager 关闭 selenium webdriver 时出现问题

python - 如何使用 F 表达式在 update() 中为每个 PointField 分配纬度和经度?

javascript - Laravel 广播 : private channels not working due to auth error

authentication - 带有自定义 header 名称的 Swagger/OpenAPI Bearer 身份验证