У меня есть:
Внешний интерфейс: React, Next.js.Использует клиент Apollo.
Серверная часть: NodeJs, сервер Express с конечной точкой GraphQL.
Я применяю файл cookie к клиенту GraphQL apollo, вот кодинстанцирование.
({ ctx, headers, initialState }) =>
new ApolloClient({
uri: "http://localhost:4000/graphql",
cache: cache,
credentials: 'include',
headers: {
authorization: Cookies.get('token') ? `Bearer ${Cookies.get('token')}` : ""},
typeDefs,
resolvers
}));
Когда я использую useQuery в своем компоненте React, я отправляю запрос graphQL бэкэнду.У меня установлено промежуточное ПО для проверки подлинности запроса путем проверки на токен.Код:
export let checkToken = (req : any, res : any, next : any) => {
let token = req.headers['authorization']; // I also tried req.headers.authorization
if (token.startsWith('Bearer ')) {
token = token.slice(7, token.length);
}
if (token) {
jwt.verify(token, config.cookieKey, (err : any, decoded : any) => {
if (err) {
Logger.info("Token in request is not valid.");
return res.json({
success: false,
message: 'Token is not valid'
});
} else {
Logger.info("Token in request is valid.");
req.decoded = decoded;
next();
}
});
} else {
Logger.info("No token in request found.");
return res.json({
success: false,
message: 'Auth token is not supplied'
});
}
};
Проблема в том, что req.headers.authorization не определен, как только он достигает бэкэнда.Я консоль зарегистрировала токен cookie ранее на стороне клиента, и он действительно возвращает cookie.
CORS EDIT
app.use(function(_req, res, next) {
res.header("Access-Control-Allow-Origin", `${config.frontend_url}`);
res.header('Access-Control-Allow-Methods', "GET,HEAD,OPTIONS,POST,PUT");
res.header("Access-Control-Allow-Credentials", "true");
res.header('Access-Control-Allow-Headers', "Access-Control-Allow-Origin, Access-Control-Allow-Headers, Origin,Accept, X-Requested-With, Content-Type, Access-Control-Request-Method, Access-Control-Request-Headers, Authorization");
next();
});
Console.log (req.headers) edit
{ accept: '*/*',
'content-type': 'application/json',
authorization: '',
'content-length': '185',
'user-agent': 'node-fetch/1.0 (+https://github.com/bitinn/node-fetch)',
'accept-encoding': 'gzip,deflate',
connection: 'close',
host: 'localhost:4000' }
{ accept: '*/*',
'content-type': 'application/json',
authorization: '',
'content-length': '185',
'user-agent': 'node-fetch/1.0 (+https://github.com/bitinn/node-fetch)',
'accept-encoding': 'gzip,deflate',
connection: 'close',
host: 'localhost:4000' }