如何从Localstorage验证令牌并将Apollo服务器中的currentUser返回到React前端?

时间:2019-06-24 09:07:36

标签: javascript authentication jwt graphql apollo

我已经有一个jwt中间件,它可以验证令牌并将currentUser返回到React前端:

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

现在,我想将逻辑集成到以下Apollo服务器中:

const app = express();
const server = new ApolloServer({
  typeDefs: gql(typeDefs),
  resolvers,
  context: async () =>({ 
  db,
  secret: process.env.SECRET,
  }),
});

app.use(cors(corsOptions));
server.applyMiddleware({ app });

最后,currentUser的值应可用于在反应前端使用。
我该如何实现?

1 个答案:

答案 0 :(得分:0)

您可以将currentUser添加到中间件内部的request对象中。接下来,传递它,将其从请求复制到GraphQL上下文。然后,您可以添加currentUser解析器,只需从上下文中返回用户即可。

您的中间件

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

您的服务器

const app = express();
const server = new ApolloServer({
  typeDefs: gql(typeDefs),
  resolvers,
  context: ({ req }) =>({ 
    currentUser: req.currentUser,
    db,
    secret: process.env.SECRET,
  }),
});

app.use(cors(corsOptions));
server.applyMiddleware({ app });

和解析器

const resolvers = {
  Query: {
    currentUser: (parent, args, context) => context.currentUser,
    ...
  }
}

添加相应的类型定义,您应该可以从客户端查询当前用户。

如果您需要更多信息here is a detailed tutorial,可能会有帮助。