API在应用连接中发挥着关键作用,但也容易受到攻击。过去,单体应用只有一个需要保护的入口点。在微服务架构中,单个应用通常由许多通过API连接的微服务组成,而每个API都可能有数百个端点。因此,API的潜在攻击面非常大,每新增一个API,都会在安全边界上增加一个入口点。
保护API安全有多种策略,其中最基本的策略之一是访问控制。简单来说,必须验证用户身份(身份验证,即AuthN),并确认用户可以访问特定资源(授权,即AuthZ)。实施OpenID Connect(OIDC)是API最常用的访问控制方法之一。借助API Connectivity Manager,只需几分钟即可完成部署并开始运行。该产品是F5 NGINX Management Suite的一部分。
本教程将介绍如何使用API Connectivity Manager和Azure Active Directory(Azure AD)设置JSON Web令牌(JWT)验证,以完成OIDC工作流中的授权环节。
什么是OpenID Connect?
OpenID Connect(OIDC)是一种基于OAuth 2.0协议构建的身份协议。OIDC允许客户端验证最终用户或设备的身份。这是访问控制的一部分;访问控制包括身份验证和授权:
- 身份验证用于验证用户或设备的身份是否与其声明一致
- 授权用于确定经过验证的用户或设备可以访问哪些资源
OIDC有多种不同的实现方式,包括本教程中将使用的Azure AD。也可以将其他OIDC解决方案与API Connectivity Manager配合使用,例如F5 BIG-IP Access Policy Manager (APM)、Okta、Auth0、Ping Identity等。
开始前的准备
请确保满足以下先决条件:
- API Connectivity Manager 已在您的环境中安装并配置
- 有效的Microsoft Azure帐户
- REST客户端(Postman,本教程使用该客户端)
如果需要访问API Connectivity Manager,可以注册NGINX Management Suite 30天免费试用。
创建Azure AD应用程序
打开浏览器并登录Azure Portal。
在左侧菜单中,点击“应用注册”。

图1:Azure AD门户主页
单击“新建注册”按钮。

图 2:Azure AD 应用注册
要创建新应用,请提供名称、重定向 URI,然后单击注册按钮。在此演示中,将使用Postman,因此需要使用Postman OIDC 重定向 URI。

图 3:创建新的 Azure AD 应用
应用创建完成后,需要创建OAuth作用域以提供API访问权限。点击左侧菜单中的“公开API”链接。

图 4:公开 API
单击“添加范围”。

图 5:添加作用域
接受默认的应用程序 ID URI,或自行创建一个,然后单击“保存并继续”按钮。如果要自行创建应用程序 ID URI,必须先在 Azure AD 中注册所需的域。

图 6:应用 ID URL
在本演示中,作用域基于Microsoft提供的示例。请填写以下信息,然后单击“添加作用域”按钮:
范围名称: Employees.Read.All
谁可以同意?: 管理员和用户
管理员同意显示名称: 对员工记录的只读访问权限
管理员同意说明: 允许以只读方式访问所有员工数据。
用户同意显示名称: 对您的员工记录的只读访问权限
用户同意说明: 允许以只读方式访问您的员工数据。

图 7:添加作用域
接下来,需要授权客户端应用程序。为此,请获取客户端ID。单击左侧菜单中的“概述”链接,然后复制“应用程序(客户端)ID”。

图8:应用程序客户端ID
再次点击“公开 API”链接,然后点击“添加客户端应用程序”按钮。

图 9:添加客户端应用程序
将应用程序客户端ID粘贴到客户端ID字段中,并选中应用程序ID URI旁边的复选框。然后,单击“添加应用程序”按钮。

图 10:添加客户端应用程序
接下来,在本演示中,将通过授权代码流使用授权代码,因此Postman需要客户端密码。单击左侧菜单中的证书和密码链接,然后单击新建客户端密码按钮。

图 11:新建客户端密钥
为密钥命名,并保留默认过期时间。

图 12:密钥名称
接下来,复制客户端密钥并将其存储在密码保管库中,以便日后使用。

图 13:客户端密钥
在 API Connectivity Manager 中配置 JWT 断言
配置好Azure AD应用程序后,即可在API Connectivity Manager中设置API网关集群,为已定义的服务执行JSON Web Token Assertion。此步骤需要确定Azure AD租户的JSON Web密钥(JWK)集的URI。
可从Azure AD租户的知名端点获取JWKS URI:
https://login.microsoftonline.com/<tenant-id>/v2.0/.well-known/openid-configuration
此页面将提供一个包含 jwks_uri 键的 JSON 有效负载。需要复制该键的值。

图14:Azure AD租户的知名端点
获取JWKS URI后,打开API Connectivity Manager控制台并转到服务代理的配置。点击“添加策略”,为“JSON Web Token Assertion”策略添加配置。

图 15:Gateway Service Proxy 策略
接下来,将Azure AD租户的JKWS URI粘贴到“URI位置”字段中,然后单击“添加”按钮。

图16:JSON Web Token断言策略
点击“保存并发布”按钮,将此策略推送到API网关集群。

图 17:服务网关策略
配置完成!API Connectivity Manager实例现已配置为在指定的服务网关上执行JWT断言。
使用Postman进行测试
现在可以测试您的设置,确保其按预期运行。开始之前,需要从Azure AD应用程序中获取以下几项信息:
- 应用程序客户端密钥(之前已保存)
- OAuth范围
- OAuth授权端点
- OAuth令牌端点
要获取OAuth作用域,请打开Azure门户并返回应用注册页面。然后,点击左侧菜单中的“公开API”链接,再点击作用域对应的“复制”图标。保存此值,稍后将会用到。

图18:API作用域
要获取OAuth授权端点和令牌端点,请单击左侧菜单中的“概述”链接,然后单击“端点”按钮。之后,复制授权端点和令牌端点的URI。

图 19:Azure AD 应用程序终结点

图20:Azure AD应用程序终结点URL
打开Postman,然后点击“Environments”菜单。接着,点击“Create Environment”链接。

图21:Postman创建环境
为环境命名,并添加6个变量。将之前步骤中保存的值分别填入“初始值”列和“当前值”列,然后单击“保存”按钮。
- client_id:Azure AD应用程序的客户端ID
- client_secret:Azure AD应用程序的客户端密钥
- auth_url:Azure AD租户的OAuth授权URL
- token_url:Azure AD租户的OAuth令牌URL
- tenant_id:Azure AD目录(租户)ID
- scope:Azure AD应用的API作用域,包含应用程序ID URL

图22:Postman环境变量
在Postman中打开一个新选项卡,然后按照以下步骤操作:
- 将右上角的环境更改为ACM in the top right
- 在地址栏中添加API URL
- 点击“Auth”选项卡
- 将类型更改为OAuth 2.0
- 在 Auth 配置中向下滚动,并设置以下变量:
- 身份验证 URL:{{auth_url}}
- 访问令牌 URL: {{token_url}}
- 客户端 ID: {{client_id}}
- 客户端密钥: {{client_secret}}
- 点击“获取新访问令牌”按钮

图23:Postman请求

图 24:Postman 身份验证配置
浏览器窗口将打开,并提示使用Azure AD凭据登录。身份验证成功后,页面将重定向回Postman,并显示以下窗口。单击“Use Token”按钮。

图25:Postman使用令牌
现在,您已获得OAuth访问令牌,可以发起API调用了。点击“保存”按钮,然后点击“发送”按钮。
如果所有配置均正确,应会看到“200 OK”响应。

图 26:Postman 请求成功
结论
现在,API Connectivity Manager已使用Azure AD OAuth访问令牌保护您的API。接下来,可以添加更多OAuth作用域,并在API Connectivity Manager中配置API网关集群,将这些作用域传递给受保护的API。相关内容将在另一篇文章中介绍!
立即开始
开始免费试用NGINX Management Suite 30天,其中包括API Connectivity Manager和Instance Manager。
本文的一个版本最初发表于codygreen.com。经作者许可,本文经编辑后在此转载。
相关博客文章
NGINX Plus R26 正式发布
NGINX Plus R26通过缓存JSON Web密钥集加快JWT验证,并强化TLS握手,从而提升安全性。NGINX JavaScript的新功能包括增强对异步函数的支持,以及实现WebCrypto API。
使用NGINX App Protect DoS保护gRPC应用,抵御严重的DoS攻击
gRPC具备开发人员设计和部署现代应用所需的速度与灵活性,但其开放性也使其极易受到第7层DoS攻击。NGINX App Protect DoS可保护gRPC应用免受此类破坏性攻击。
Ingress Controller 选型指南(第 2 部分):风险与面向未来的规划
了解选择错误的Ingress控制器可能带来的风险,以及如何从关键方面着手,让您的选择更好地适应未来需求。
NGINX Plus R19 正式发布
NGINX Plus R19扩展了监控功能,不仅提供更多指标,还新增了指标分析方式;增加试运行模式,用于测试限速效果;增强键值存储,以支持IP地址范围;并使限速更加动态。
NGINX现已正式加入F5
NGINX现已正式成为F5的一部分。Gus Robertson现任F5 NGINX业务部门负责人。他阐述了两家公司在人才、文化和愿景方面融合的价值,以及双方将如何携手增强NGINX的开源产品和商业产品。
