使用 GraphQL 和 jwt-express 绕过 JWT

Posted

技术标签:

【中文标题】使用 GraphQL 和 jwt-express 绕过 JWT【英文标题】:Bypass JWT with GraphQL and jwt-express 【发布时间】:2018-06-25 05:49:45 【问题描述】:

对于我的后端,我使用 Node.js、Express 和 GraphQL。我已经使用 jwt 实现了身份验证,如果没有用户登录,它将保护我的路由。问题是我希望某些路由不受保护,即您不必登录即可查看 /home

因为我在这个项目中使用 Express,所以我也有 jwt-express,他们提供了类似这样的东西:.unless(path: ['/token'])。现在,如果我有 REST-API,这将工作,但因为我只有 GraphQL 和 GraphQL有一条路行不通。

我的index.js 文件中只有这个:

app.use(jwt(secret: constants.JWT_SECRET))

app.use(
 graphqlEndpoint,
 bodyParser.json(),
 graphqlExpress(async req => 
   let user = null
   if (req.user) 
     user = await knex(‘users’).where(‘id’, req.user.id).first()
     console.log(user)
   
   return 
     schema,
     context: user
   
 )
)

但我必须确保它让我进入,无论是否使用令牌。

所以我只是想知道是否有人对如何实现这一点有一些提示,因为我很困惑。

【问题讨论】:

您能否与我分享您的方法,我在过去一周一直坚持这一点。如果我在中间件之前添加登录名(一个 graphqlExpress 但 graphql 端点相同),我将无法访问其他实体(其他 graphqlExpress 但端点 graphql 相同)。如果我在同一个 graphqlExpress 函数中添加错误是没有找到令牌,因为我在这里添加了中间件。 .我谷歌但没有关闭的解决方案。谢天谢地,我找到了你的帖子。请帮帮我,我被卡住了:( @Tested 同上。关于这个或来源的任何解决方案?希望对此有一些指导。 【参考方案1】:

如果您使用app.use(jwt(secret: constants.JWT_SECRET)),它将在每个请求中读取 JWT。有两种选择:

您在所需的特定路由中应用中间件 已通过身份验证。 您应该在使用 jwt 之前添加登录路由。

【讨论】:

感谢您的回复。我想我现在必须做很多谷歌搜索,呵呵【参考方案2】:

可以指定 express-jwt 让未注册用户通过:

app.use(jwt(
  secret: 'hello world !',
  credentialsRequired: false
));

来源:express-jwt 的 README.md https://github.com/auth0/express-jwt

【讨论】:

以上是关于使用 GraphQL 和 jwt-express 绕过 JWT的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 GraphQL.Net 和 c# 将集合传递给 GraphQL 突变?

使用 REST 包装 GraphQL 从 NestJS 提供 GraphQL 和 REST API

GraphQL 和 graphql-sequelize-schema-generator

使用 express-graphql 和 HTTP 客户端从 graphql 获取数据

如何使用 graphql 和 mongoose 进行突变

使用 graphql-java-tools 和 graphql-spring-boot-starter 处理错误