如何从 NestJS 中的 GraphQL 解析器内部设置会话密钥?

Mik*_*oid 5 authentication typescript graphql nestjs

我正在发现 Nest.js,并且想使用 GraphQL 设置基于 cookie 的身份验证系统。

我已经安装了express-session中间件,这是配置:

主要.ts

 app.use(
    session({
      store: new redisStore({
        client: redis
      } as any),
      name: 'qid',
      secret: SESSION_SECRET,
      resave: false,
      saveUninitialized: false,
      cookie: {
        httpOnly: true,
        secure: !isDev,
        maxAge: 1000 * 60 * 60 * 24 * 7 * 365
      }
    })
  )
Run Code Online (Sandbox Code Playgroud)

它工作正常,因为当我这样做时:

 app.use((req: any, res: any, next: any) => {
      // Debug purpose
      req.session.userId = '42'
      next()
    })
Run Code Online (Sandbox Code Playgroud)

cookie 已添加。

现在我有两个突变,注册登录。在登录突变(或在 userService 中)中,在我找到用户后,我想做类似的事情req.session.userId = user.id,但我找不到方法来做到这一点。

我尝试添加@Context() ctx我的突变。如果我控制台日志 ctx,它包含我期望的所有内容(例如 req.session.id)

但如果我这样做了ctx.req.session.userId = 'something',cookie 就不会被设置!

这是我的突变:

用户解析器.ts

@Mutation('login')
  async login(
    @Args('email') email: string,
    @Args('password') password: string,
    @Context() ctx: any
  ) {
    console.log(ctx.req.session.id) // Show the actual session id
    ctx.req.session.userId = 'something' // Do not set any cookie
    return await this.userService.login(email, password)
  }
}
Run Code Online (Sandbox Code Playgroud)

我完全迷失了,我真的需要帮助,我很想了解发生了什么。我知道我可能这样做完全错误,但我对 Nest 和 GraphQL 都是新手。

感谢你们...

Mik*_*oid 4

几天后我发现了问题......而且是......

GraphQL Playground -> 设置 -> 添加“request.credentials”:“include”(并且没有“omit”)

希望它能帮助别人..