加入我们,于10月8日至10日在纽约市了解关于GraphQL联邦和API平台工程的最新的技巧、趋势和新闻。参加纽约市的GraphQL Summit 2024
文档
免费开始

使用GraphOS路由器进行请求认证

使用授权和认证策略来保护您的图

服务器路由器认证

自托管的限制是GraphOS企业计划。其他计划类型使用GraphOS托管云路由。查看定价页面了解详细信息。

💡 提示

如果您是寻求更多关于此主题内容的企事业客户,请尝试企业最佳实践:路由器扩展性在Odyssey上的课程。

不是企事业客户? 了解GraphOS企业版。

在将作为您联合的入口点时,您有几个选项来对传入的客户端请求进行身份验证:

实际上,我们建议您结合这三种策略以创建一个更健壮的身份验证系统!

使用授权指令

除了下面概述的方法之外,您还可以使用授权指令router层强制执行授权。这样可以在request击中您的subgraphs之前授权请求,从而节省带宽和处理时间。

这是GraphOS Router的企业功能,需要一个拥有GraphOS企业计划的组织。

SubgraphRouterClientSubgraphRouterClientValidate requestalt[Request is invalid][Request is valid]Request with tokenRespond 401 UnauthorizedRequest Data

一旦通过JWT验证或协处理器使请求的声明可用,它们可以用来匹配所需的类型和作用域,以强制执行授权策略。

# Request's authorization claims must contain `read:users`
type Query {
users: [User!]! @requiresScopes(scopes: [["read:users"]])
}
# Request must be authenticated
type Mutation {
updateUser(input: UpdateUserInput!): User! @authenticated
}

优点

  • 在处理请求之前进行授权验证可以在发现未经授权的请求时立即终止它们,从而减少对服务负载的影响。
  • 可以采用并维护的声明性方法,同时中央强制执行

缺点

  • 为了选择此授权模型,需要为每个子图更新架构。

在子图中进行身份验证

最简单的身份验证策略是将身份验证委托给您的独立子图服务。

SubgraphRouterClientSubgraphRouterClientAuthenticate request with tokenRequest with tokenRequest with token

要传递Authentication头从客户端请求到您的子图,添加以下内容到您的router's YAML配置文件中:

headers:
all:
request:
- propagate:
named: authorization

优点

  • 需要将您的router配置更改最小化。
  • 可以利用子图中的现有身份验证代码,这些代码通常与数据源

缺点

  • 每个子图需要对处理请求进行身份验证。
  • 如果子图是用不同的语言编写的,则维护每个子图的一致身份验证代码是复杂的。

使用JWT身份验证插件

router v1.13起,您可以使用JWT身份验证插件来验证您的supergraph中的基于JWT的身份验证令牌。

此功能仅适用于GraphOS专用或企业计划。
要比较所有计划类型对GraphOS功能的支持,请参阅 定价页面.

SubgraphJWKS EndpointRouterClientSubgraphJWKS EndpointRouterClientValidate JWTExtract claims in RhaiCheck claims on headersRequest with JWTFetch key setPublic keysRequest with extracted claims in headers

authentication:
jwt:
jwks:
- url: https://dev-zzp5enui.us.auth0.com/.well-known/jwks.json

优点

  • router阻止未经身份验证的请求到达您的子图。
  • router可以从JWT中提取声明并将它们作为头传递给您的子图,从而减少子图中所需的逻辑。

缺点

  • 它仅支持基于JWT的身份验证,使用来自JWKS端点的密钥。

使用协处理器

如果您有自定义身份验证策略,您可以使用协处理器来实现。

此功能仅适用于GraphOS专用或企业计划。
要比较所有计划类型对GraphOS功能的支持,请参阅 定价页面.

SubgraphCoprocessorRouterClientSubgraphCoprocessorRouterClientValidate requestCan also add new headersalt[Request is invalid][Request is valid]Check claims on headersRequest with tokenRequest with headers and contextRespond { control: { break: 401 } }Respond { control: "continue" }Request with new headers

coprocessor:
url: http://127.0.0.1:8081
router:
request:
headers: true

This example coprocessor is written in Node.js and uses Express

const app = express();
app.use(bodyParser.json());
app.post('/', async (req, res) => {
const {headers} = req.body;
const token = headers.authorization;
const isValid = await validateToken(token);
if (!isValid) {
res.json({
...req.body,
control: {break: 401}
});
} else {
res.json({
...req.body,
control: 'continue',
headers: {'x-claims': extractClaims(token)}
});
}
});

优点

  • 您可以在任何语言或框架中实现任何认证策略,只要协处理器提供了一个HTTP端点。
  • 您可以使用协处理器向请求添加头部,这些头部可以被您的 子图 用于额外的授权。

缺点

  • 实现协处理器最初的工作并不简单,但一旦部署,它就可以用于各种 路由器 定制。

组合认证策略

您可以将这些策略结合起来,以处理各种认证要求并实践“纵深防御”。

  1. 使用JWT认证插件验证JWT基于的认证令牌。
  2. 使用auth 来强制执行认证和授权,并在 超图谱
  3. 使用协处理器识别使用旧认证策略的流量并将旧会话令牌转换为JWT。
  4. 将JWT转发到 子图 以进行额外的授权。
下一步
首页
评价文章评价在GitHub上编辑Edit论坛Discord

©2024Apollo Graph Inc.,即Apollo GraphQL。

隐私政策

公司