Из graphql yoga внутри своих распознавателей я проверяю перед вызовом распознавателя, защищен ли этот распознаватель или нет.
Если распознаватель защищен, а пользователь не вошел в систему, я могу выдать ошибку, например:
return new Error('Token is missing');
Это останавливает выполнение запроса и возвращает правильную форму сообщения с полем ошибки.
{
"data": null,
"errors": [
{
"message": "Token is missing",
"locations": [
{
"line": 3,
"column": 3
}
],
"path": [
"users"
]
}
]
}
Ответ имеет статус 200, что неверно. Я хотел бы иметь возможность выбрать свой собственный статус, например, 403.
Вот моя текущая реализация преобразователей:
const withAuth = authed => (_, args, context, ...rest) => {
if (!context.token) {
return new Error('Token is missing');
}
let result = null;
try {
result = jwt.verify(context.token, process.env.HASH);
} catch (__) {
return new Error('Incorrect token');
}
const { username, email } = result;
if (!username || !email) {
return new Error('Incorrect token');
}
return authed(_, args, { ...context, user: { username, email } }, ...rest);
};
const resolvers = {
Query: {
users: withAuth(resolver(User)), //get users from db
}
Я бы добавил промежуточное программное обеспечение перед запросом в экспрессе, но нет способа определить, какой запрос вызывается, поскольку все вызовы выполняются на одной и той же конечной точке.
Любой вклад будет оценен!