使用阿波罗服务器在上下文中设置当前用户

时间:2018-08-28 12:04:40

标签: reactjs graphql 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})

1 个答案:

答案 0 :(得分: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 });

现在,您应该在架构上下文中拥有用户。我希望很清楚,代码尚未完成,但是应该易于完成所有工作。