使用Kong Konnect在API网关实现GraphQL授权

作者:API传播员 · 2025-11-16 · 阅读时间:6分钟

在本篇文章中,我们将深入探讨如何解决GraphQL授权的技术挑战,分析当前行业中常见的解决方案,并重点介绍Kong与OPA(开放策略代理)的集成如何提升GraphQL的安全性标准。最后,我们还将通过一个简短的教程,展示如何在Kong Konnect的API网关层实现GraphQL授权。


简介

GraphQL因其灵活性和强大的查询能力而备受欢迎,但与此同时,其安全性问题也让许多组织望而却步。与REST API相比,GraphQL在安全性方面存在显著差异,尤其是在授权层面。

下图展示了GraphQL和REST API在漏洞问题上的相似性:

尽管两者在漏洞类型上有许多重叠,但GraphQL的查询语言特性使得在实现安全解决方案时需要进行大量调整。特别是,GraphQL的动态查询和变更能力增加了授权逻辑的复杂性,使其比REST更容易出现授权缺陷。

为什么GraphQL授权难以解决?

与REST API相比,GraphQL的灵活性使得授权需求更加复杂。在REST API中,端点是静态定义的,输入和输出明确,授权逻辑可以针对每个端点进行定制。而GraphQL的嵌套查询特性则使得授权逻辑难以覆盖所有可能的访问控制场景。

以下是一个示例应用程序的对比:

在REST中,用户需要通过多个API调用获取所需数据,而GraphQL则可以通过一个嵌套查询实现同样的功能。这种灵活性虽然提高了开发效率,但也带来了更复杂的授权需求。例如,如何确保用户仅能访问其有权限的嵌套数据?

此外,GraphQL联合(Federation)进一步加剧了授权的复杂性。


今天GraphQL授权是如何解决的?

目前,支持在API网关层执行GraphQL授权的解决方案较少。这种情况在一定程度上被视为反模式,因为API网关不仅是统一入口点,还能标准化许多常见任务,如速率限制、缓存、身份验证和授权。

为了提升GraphQL的安全性,使其与REST API达到同等水平,我们需要在API网关层实现更强大的授权机制。

接下来,我们将探讨Kong Konnect与OPA集成的解决方案,以及它在GraphQL授权中的优势。


如何在Kong Konnect的API网关层执行GraphQL授权

Kong提供了丰富的插件生态系统,其中包括ACL、OIDC和OPA插件。然而,ACL和OIDC插件在处理GraphQL授权需求时存在局限性。GraphQL授权需要更复杂的逻辑支持,例如模式验证、查询解析和变量验证,而这些功能可以通过OPA实现。

什么是OPA?

OPA(开放策略代理)是一种将策略与服务代码解耦的工具,能够实现策略的发布、分析和审查。它的优势在于提高了透明度和安全性,同时支持构建复杂的访问控制策略。

为了支持GraphQL社区,OPA最近引入了内置函数,这些函数提供了构建GraphQL访问控制策略所需的工具,包括:

  • 模式验证
  • GraphQL抽象语法树解析
  • 查询变量验证
  • 与JWT令牌验证的集成

Kong Konnect与OPA的参考架构

该解决方案结合了Konnect、OIDC插件和OPA策略引擎。以下是架构的详细说明:

  1. 用户的GraphQL请求首先到达Kong网关。
  2. 网关将用户重定向到身份提供者(IdP)进行身份验证,并颁发JWT令牌。
  3. JWT令牌和GraphQL请求被传递到OPA引擎,OPA根据授权策略评估用户和查询的权限。
  4. 如果授权通过,网关将请求代理到上游GraphQL服务。

这种架构不仅提升了GraphQL授权的安全性,还能与现有的身份验证机制无缝集成。


为什么选择Konnect解决GraphQL安全问题?

正如Ray Ozzie所言:“复杂性是致命的。”API网关平台需要简化复杂性,以便开发人员能够专注于核心业务需求。Konnect作为一个联合API管理平台,能够以协议无关的方式分离策略和代码,从而简化复杂性并提高灵活性。

Konnect的优势包括:

  • 平台无关性
  • 协议无关性
  • 支持多种API管理需求

教程:使用Kong Konnect保护GraphQL API

以下是一个简短的教程,展示如何在Kong Konnect中实现GraphQL授权。完整教程可在GitHub仓库中找到。

场景描述

我们将保护Frankfurter GraphQL API,这是一个汇率演示API。在Keycloak中,我们设置了两种用户类型:

  • kong用户:具有特权,能够访问frankfurter_convertedAmount类型定义。
  • customers用户:仅能访问frankfurter_currency_list类型定义。

权限矩阵如下:

GraphQL OPA策略解析

OPA策略的核心逻辑包括:

  1. 将查询解析为抽象语法树(AST)并根据模式验证。
  2. 基于声明限制访问控制。
  3. 验证输入常量。
  4. 验证输入查询变量。

以下是策略的部分代码示例:

# 将查询解析为AST并根据模式验证
query_ast := graphql.parse_and_verify(input.request.http.parsed_body.query, schema)

# 允许kong用户查询特定类型
allowed_kong_query(q) {
  is_kong_id
  value_raw := constant_string_arg(q, "from")
  value_raw == "EUR"
  amount_var := variable_arg(q, "amount")
  amount := input.request.http.parsed_body.variables[amount_var]
  amount > 5
}

测试行为

我们可以通过Insomnia测试不同用户的行为:

  • Kong用户:能够成功查询frankfurter_convertedAmount类型定义。
  • Customers用户:仅能查询frankfurter_currency_list类型定义,其他查询将返回403错误。

以下是测试示例:


总结

本文探讨了GraphQL授权的挑战,介绍了Kong Konnect与OPA的集成解决方案,并通过教程展示了具体实现方法。通过这种架构,组织可以显著提升GraphQL的安全性,同时简化复杂性。

未来,我们还将探索如何扩展该框架以支持GraphQL联合(Federation),敬请期待!

原文链接: https://konghq.com/blog/engineering/graphql-authorization-at-the-api-gateway-with-kong-konnect-and-opa