使用GraphOS路由器进行请求认证
使用授权和认证策略来保护您的图
自托管GraphOS路由器的限制是GraphOS企业计划。其他计划类型使用GraphOS托管云路由。查看定价页面了解详细信息。
在将路由器作为您联合超级图表的入口点时,您有几个选项来对传入的客户端请求进行身份验证:
- 使用授权指令
- 将身份验证委派给您的子图
- 使用JWT身份验证插件来您的supergraph。
- 使用协处理器。
实际上,我们建议您结合这三种策略以创建一个更健壮的身份验证系统!
使用授权指令
除了下面概述的方法之外,您还可以使用授权指令在router层强制执行授权。这样可以在request击中您的subgraphs之前授权请求,从而节省带宽和处理时间。
这是GraphOS Router的企业功能,需要一个拥有GraphOS企业计划的组织。
一旦通过JWT验证或协处理器使请求的声明可用,它们可以用来匹配所需的类型和字段作用域,以强制执行授权策略。
# Request's authorization claims must contain `read:users`type Query {users: [User!]! @requiresScopes(scopes: [["read:users"]])}# Request must be authenticatedtype Mutation {updateUser(input: UpdateUserInput!): User! @authenticated}
优点
- 在处理请求之前进行授权验证可以在发现未经授权的请求时立即终止它们,从而减少对服务负载的影响。
- 可以采用并维护的声明性方法,同时中央强制执行子图。
缺点
- 为了选择此授权模型,需要为每个子图更新架构。
在子图中进行身份验证
最简单的身份验证策略是将身份验证委托给您的独立子图服务。
要传递Authentication
头从客户端请求到您的子图,添加以下内容到您的router's YAML配置文件中:
headers:all:request:- propagate:named: authorization
优点
- 需要将您的router配置更改最小化。
- 可以利用子图中的现有身份验证代码,这些代码通常与数据源的授权逻辑相关联。
缺点
- 每个子图需要对处理请求进行身份验证。
- 如果子图是用不同的语言编写的,则维护每个子图的一致身份验证代码是复杂的。
使用JWT身份验证插件
自router v1.13起,您可以使用JWT身份验证插件来验证您的supergraph中的基于JWT的身份验证令牌。
此功能仅适用于GraphOS专用或企业计划。
要比较所有计划类型对GraphOS功能的支持,请参阅 定价页面.
authentication:jwt:jwks:- url: https://dev-zzp5enui.us.auth0.com/.well-known/jwks.json
优点
- router阻止未经身份验证的请求到达您的子图。
- router可以从JWT中提取声明并将它们作为头传递给您的子图,从而减少子图中所需的逻辑。
缺点
- 它仅支持基于JWT的身份验证,使用来自JWKS端点的密钥。
使用协处理器
如果您有自定义身份验证策略,您可以使用协处理器来实现。
此功能仅适用于GraphOS专用或企业计划。
要比较所有计划类型对GraphOS功能的支持,请参阅 定价页面.
coprocessor:url: http://127.0.0.1:8081router: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端点。
- 您可以使用协处理器向请求添加头部,这些头部可以被您的 子图 用于额外的授权。
缺点
- 实现协处理器最初的工作并不简单,但一旦部署,它就可以用于各种 路由器 定制。
组合认证策略
您可以将这些策略结合起来,以处理各种认证要求并实践“纵深防御”。
- 使用JWT认证插件验证JWT基于的认证令牌。
- 使用auth 指令 来强制执行认证和授权,并在 超图谱 层
- 使用协处理器识别使用旧认证策略的流量并将旧会话令牌转换为JWT。
- 将JWT转发到 子图 以进行额外的授权。