从网关直接调用实现服务
Directly calling implementing service from the gateway
我正在使用 Apollo Federation,我想在网关中实现一些自定义身份验证行为,例如直接从网关调用实现服务以获取用户数据,然后我可以将其添加为a header 转发给请求的实施服务。做这样的事情可能吗?这种模式常见还是不推荐?
你绝对可以做到。
const gateway = new ApolloGateway({
serviceList,
buildService({ url, name }) {
// Do something here to process stuff. If you're using RemoteGraphQLDataSource:
return new RemoteGraphQLDataSource({
url,
name,
willSendRequest({ request, context }): void {
// This `context` is the object you're returning "down there"
// Add content to your request
if (context.viewer) {
request.http.headers.set('something', 'data');
}
},
});
},
});
const server = new ApolloServer({
gateway,
// { req, res } is used for apollo-server (or apollo-server-express)
// { event } is used for apollo-server-lambda
context: async ({ req, res }) => {
const authHeader = req.headers.Authorization', '');
const accessToken = authHeader.replace(/Bearer /, '');
const viewer = await someAsyncSomethingToGetTheUserData({ accessToken });
// this is the `context` object you use "up there"
return {
viewer,
};
},
});
一些注意事项:
- 如果您要向您的支持服务发送“可信数据”,请确保“普通客户”无法访问您的支持服务。否则,您将信任可能由不受信任的系统或人员发送的数据。
- 确保你没有在这个函数中做很多繁重的工作,因为你在处理每个请求时都这样做,无论你的支持服务是否需要它,GraphQL 的价值之一就是你永远不要做客户没有特别要求的工作。
我正在使用 Apollo Federation,我想在网关中实现一些自定义身份验证行为,例如直接从网关调用实现服务以获取用户数据,然后我可以将其添加为a header 转发给请求的实施服务。做这样的事情可能吗?这种模式常见还是不推荐?
你绝对可以做到。
const gateway = new ApolloGateway({
serviceList,
buildService({ url, name }) {
// Do something here to process stuff. If you're using RemoteGraphQLDataSource:
return new RemoteGraphQLDataSource({
url,
name,
willSendRequest({ request, context }): void {
// This `context` is the object you're returning "down there"
// Add content to your request
if (context.viewer) {
request.http.headers.set('something', 'data');
}
},
});
},
});
const server = new ApolloServer({
gateway,
// { req, res } is used for apollo-server (or apollo-server-express)
// { event } is used for apollo-server-lambda
context: async ({ req, res }) => {
const authHeader = req.headers.Authorization', '');
const accessToken = authHeader.replace(/Bearer /, '');
const viewer = await someAsyncSomethingToGetTheUserData({ accessToken });
// this is the `context` object you use "up there"
return {
viewer,
};
},
});
一些注意事项:
- 如果您要向您的支持服务发送“可信数据”,请确保“普通客户”无法访问您的支持服务。否则,您将信任可能由不受信任的系统或人员发送的数据。
- 确保你没有在这个函数中做很多繁重的工作,因为你在处理每个请求时都这样做,无论你的支持服务是否需要它,GraphQL 的价值之一就是你永远不要做客户没有特别要求的工作。