使用apollo服务器在上下文中设置当前用户

问题描述 投票:0回答:1

我有这个中间件,需要让当前用户在apollo服务器的上下文中设置它

 app.use(async (req, res, next)=>{
 const token = req.headers['authorization'];
 if(token !== "null"){
  try {
      const currentUser = await  jwt.verify(token, process.env.SECRET)
      req.currentUser = currentUser;
  } catch (error) {
      console.log(error);
  }


 }
 next()

   })

并需要在上下文中设置当前用户

  const SERVER = new ApolloServer({
      schema,
      context:{
          currentUser //need to set this current user
         }
  })


   SERVER.applymiddleware({app})
reactjs graphql apollo
1个回答
1
投票

Apollo服务器中的上下文api提供如下处理请求

const initGraphQLserver = () => {
  const graphQLConfig = {
    context: ({ req, res }) => ({
      user: req.user,
    }),
    rootValue: {},
    schema,
  };

  const apolloServer = new ApolloServer(graphQLConfig);
  return apolloServer;
};

这将假设您将拥有适当的中间件来解析cookie或标头。这取决于您的身份验证机制,因为您之前需要在某些中间件中为请求设置用户,如果您想使用JWT,您可以使用例如此中间件

const auth = (req, res, next) => {
  if (typeof req.headers.authorization !== 'string') {
    return next();
  }

  const header = req.headers.authorization;
  const token = header.replace('Bearer ', '');
  try {
    const jwtData = jwt.verify(token, JWT_SECRET);
    if (jwtData && jwtData.user) {
      req.user = jwtData.user;
    } else {
      console.log('Token was not authorized');
    }
  } catch (err) {
    console.log('Invalid token');
  }
  return next();
};

如果jwt令牌正确,此中间件将注入用户,然后在您的服务器文件中,您将需要具有以下中间件顺序

const app = express();

app.use(auth);

initGraphQLserver().applyMiddleware({ app });

现在,您应该在架构上下文中拥有用户。我希望很明显,代码没有完成,但应该很容易完成所有事情。

© www.soinside.com 2019 - 2024. All rights reserved.