如何使用Express和Apollo服务器获取HTTP授权标头"/>
如何使用Express和Apollo服务器获取HTTP授权标头
我无法访问我的Apollo服务器上每个HTTP请求(通过express实现的“授权”标头)。这是我的express,Apollo-Server,CORS等设置。
const corsConfig = {
credentials: true,
allowedHeaders: ['Authorization'],
exposedHeaders: ['Authorization']
};
const app = express()
const server = new ApolloServer({
schema,
context: ({ req }) => {
return {
req
};
}
});
server.applyMiddleware({
app,
path,
cors: corsConfig
});
http.createServer(app).listen(port, () => logger.info(`Service started on port ${port}`));
在我的解析器内部,我引入了上下文,尤其是req对象(这是一个graphQL端点解析器示例:]
const exampleQuery = async (parent, input , { req }) => {
console.log(req.headers);
/*
The output of this log:
{
'content-type': 'application/json',
accept: '*/*',
'content-length': '59',
'user-agent': 'node-fetch/1.0 (+)',
'accept-encoding': 'gzip,deflate',
connection: 'close',
host: 'localhost:3301',
'Access-Control-Allow-Headers': 'Authorization',
'Access-Control-Expose-Headers': 'Authorization'
}
*/
}
我已通过“授权”标头向此端点发送了请求,其中包含令牌作为值。但是,Authorization标头不在req.headers对象中(实际上,它也不在整个req对象中)。我确定我对此端点的Postman / Insomnia HTTP请求正在发送Authorization标头,但是它似乎没有通过我的Apollo-Server。任何人都对为何未通过Authorization标头有任何见解?
回答如下:例如,它按预期工作
server.ts
:
import { ApolloServer, gql, makeExecutableSchema } from 'apollo-server-express';
import express from 'express';
import http from 'http';
const corsConfig = {
credentials: true,
allowedHeaders: ['Authorization'],
exposedHeaders: ['Authorization'],
};
const typeDefs = gql`
type Query {
hello: String
}
`;
const resolvers = {
Query: {
hello: (_, __, { req }) => {
console.log(req.headers);
return 'world';
},
},
};
const schema = makeExecutableSchema({ typeDefs, resolvers });
const app = express();
const path = '/graphql';
const port = 3000;
const server = new ApolloServer({
schema,
context: ({ req }) => {
return {
req,
};
},
});
server.applyMiddleware({ app, path, cors: corsConfig });
http.createServer(app).listen(port, () => console.info(`Service started on port ${port}`));
通过curl发送GraphQL查询HTTP请求:
curl -X POST -H "Content-Type: application/json" -H "Authorization: Bearer abc123" --data '{ "query": "{ hello }" }' http://localhost:3000/graphql
{"data":{"hello":"world"}}
服务器端日志:
Service started on port 3000
{ host: 'localhost:3000',
'user-agent': 'curl/7.54.0',
accept: '*/*',
'content-type': 'application/json',
authorization: 'Bearer abc123',
'content-length': '24' }
更多推荐
如何使用Express和Apollo服务器获取HTTP授权标头
发布评论