В настоящее время у меня есть серверная часть Node.js, на которой запущен Express с Passport.js для аутентификации, и я пытаюсь переключиться на GraphQL с Apollo Server. Моя цель - реализовать ту же аутентификацию, которую я использую в настоящее время, но не могу понять, как оставить одни резолверы общедоступными, включив авторизацию для других. (Я попытался тщательно изучить этот вопрос, но пока не смог найти подходящего решения.)
Вот мой код в его нынешнем виде:
Моя стратегия JWT:
const opts = {};
opts.jwtFromRequest = ExtractJwt.fromAuthHeaderAsBearerToken();
opts.secretOrKey = JWT_SECRET;
module.exports = passport => {
passport.use(
new JwtStrategy(opts, async (payload, done) => {
try {
const user = await UserModel.findById(payload.sub);
if (!user) {
return done(null, false, { message: "User does not exist!" });
}
done(null, user);
} catch (error) {
done(err, false);
}
})
);
}
Моя конфигурация server.js и Apollo: (в настоящее время я извлекаю токен-носитель из заголовков HTTP и передаю его своим распознавателям с помощью объекта контекста):
const apollo = new ApolloServer({
typeDefs,
resolvers,
context: async ({ req }) => {
let authToken = "";
try {
if (req.headers.authorization) {
authToken = req.headers.authorization.split(" ")[1];
}
} catch (e) {
console.error("Could not fetch user info", e);
}
return {
authToken
};
}
});
apollo.applyMiddleware({ app });
И, наконец, мои резолверы:
exports.resolvers = {
Query: {
hello() {
return "Hello world!";
},
async getUserInfo(root, args, context) {
try {
const { id } = args;
let user = await UserModel.findById(id);
return user;
} catch (error) {
return "null";
}
},
async events() {
try {
const eventsList = await EventModel.find({});
return eventsList;
} catch (e) {
return [];
}
}
}
};
Моя цель - оставить некоторые запросы, такие как первый ("привет"), общедоступными, а остальные ограничить запросами только с действительными токенами-носителями. Однако я не уверен как реализовать эту авторизацию в преобразователях с использованием Passport.js и Passport-JWT в частности (обычно это делается путем добавления промежуточного программного обеспечения к определенным конечным точкам, однако, поскольку у меня будет только одна конечная точка (/ graphql) в этом Например, этот параметр ограничит все запросы только аутентифицированными пользователями, что не является тем, что я ищу. Мне нужно каким-то образом выполнить авторизацию в преобразователях, но я не знаю, как это сделать с помощью инструментов, доступных в Passport.js.)
Любые советы высоко ценится!