reactjs - 阿波罗。如何在没有 jwt 令牌检查的情况下允许登录/注册查询?
问题描述
如何在没有 jwt 令牌检查的情况下允许登录/注册查询?
我在 Apollo 中获取用于登录/注册查询的 jwt 令牌时遇到问题。我试图了解如何不检查查询(突变)登录/注册的检查正确性 jwt 令牌。例如,对于我的应用程序中的第一次登录,我没有令牌,因此空字符串或 null 或未定义不正确,我无法调用查询登录/注册。
我尝试在上下文中检查令牌。
const getTokenPayload = async (token?: string) => {
try {
return await jwt.verify(token, config.jwtSalt);
} catch (e) {
throw new ApolloError(`Token doesn't valid`, errorCodes.ERROR_TOKEN_IS_NOT_VALID);
}
};
const apolloServerStart = (store) => {
const server = new ApolloServer({
context: async ({ req }) => {
const tokenPayload = await getTokenPayload(req.headers.authorization);
return {
userId: tokenPayload.id,
};
},
typeDefs,
resolvers,
dataSources: () => ({
userAPI: new UserAPI({ store }),
cardSetAPI: new CardSetAPI({ store }),
}),
});
const app = express();
server.applyMiddleware({ app });
app.listen(
{ port: 4000 },
() => console.log(`Server ready at http://localhost:4000${server.graphqlPath}`) // eslint-disable-line no-console
);
};
connectToDb(apolloServerStart);
解决方案
实例化 ApolloServer 时,在上下文生成函数中,如果缺少 JWT,则不能抛出任何错误。
context: async ({ req }) => {
let userId = null;
try {
const tokenPayload = await jwt.verify(req.headers.authorization, config.jwtSalt);
userId = tokenPayload?.id;
} catch (err) {}
return {
userId
};
}
上面的代码将让每个请求都传递给解析器,无论 JWT 是否无效/丢失。因此,您必须保护您的 PRIVATE 解析器(确保只有登录用户的请求才能到达它们)。为此,您可以定义一个所谓的“Guard”。这是一个包装解析器的函数,检查上下文中是否存在 userId,并在令牌无效(userId 为空)的情况下向客户端返回错误。
只需使用保护函数包装您的所有私有解析器。不要使用 GUARD 函数包装登录和注册解析器。这样,未经身份验证的用户可以调用它们!
推荐阅读
- javascript - 通过 addEventListener 添加的事件监听器被多次调用
- java - 无法使用 SLF4J + Log4J 记录调试记录器
- python - 比较同一数据框中的两列
- c# - GeckoWebbrowser 在 vb.net 中单击类名
- python - 如何在xml文件中使用python插入值
- python - 使用 MNIST 数据集 Pytorch 训练 SqueezeNet 模型
- javascript - 通过键聚合对象数组
- format - 在 Format 模块上配置更大的列限制
- javascript - 扩展打字稿接口
- mysql - MySQL如何将平均值获取到特定范围内