创建一个发放带有权限范围的令牌并作为您公司微服务的API网关的认证服务器,需要一个安全的分层结构,包括认证服务器、API网关以及与所有微服务的集成。以下是构建该系统的步骤概述:
API接口简单例子微服务及其安全性——微服务架构有很多好处。其中一个好处是系统自然地划分为自治的微服务组件,这些组件负责业务的不同部分;它们不但易于扩展,还可以独立部署。
- 步骤一 — 定义认证服务器的步骤
🔒请选择一个认证协议
:
选择在 OAuth 2.0
之上使用 OpenID Connect
(OIDC)功能,它支持带有范围的令牌认证功能。
OAuth 2.0
常用于发放访问令牌,而 OIDC
则增加了用户信息的层面(如果您的网关需要用户详情,这会非常有用)。
🔒使用身份提供器(IdP):
设置一个专用的身份提供商,例如使用Azure AD:
[**Keycloak**](https://www.keycloak.org/)
是一个开源的身份和访问管理系统。它提供了用户联邦、强认证机制、用户管理和细粒度的权限控制。
[**Okta**](https://www.okta.com/)
是一家总部设在旧金山的美国身份管理和访问控制公司。它提供云端软件来帮助公司管理和保护用户对应用程序的认证,同时也为开发者提供在应用程序、网站、网络服务和设备中构建身份控制的功能。
**Auth0**
](https://auth0.com/) 是一个平台工具,企业和开发者用来在授予用户访问网站和应用权限之前验证其身份。
或者一个自定义的 OAuth 2.0/OIDC 服务器
(例如,使用 Node.js 和 node-oidc-provider,或 Python 中的 Authlib 库)。
🔒权限范围和权限设置
:
在 IdP
中定义权限来表示对各种资源的不同访问权限。例如,read:orders
和 write:orders
这样的权限可以对应不同的 API 访问权限。
- 步骤二 — 设置 JWT 用于令牌管理
🔒JWT Token 发布
:
配置您的 IdP
以颁发用于访问的 JSON Web 令牌(JWTs)。JWTs 是这样的令牌:它们是包含关于用户的声明和权限范围的签名且防篡改的令牌。
🔒定义Token格式
:
设置令牌声明,使其包含用户角色、使用范围、发行者(iss)、受众(aud)以及过期时间(exp)。为了安全起见,确保令牌的过期时间较短,并且同时要确保刷新令牌的安全管理得当 — 更多关于令牌的信息请见此处。
🔒签名及验证
:
使用 RS256(基于 RSA 的签名)或 ES256(椭圆曲线签名)来对令牌进行签名。网关可以利用 IdP
提供的公钥来检查这些签名的有效性。
- 步骤三,配置 API 网关
🔒与**身份提供方(IdP)**集成
可以使用像 Kong、NGINX 或 AWS API Gateway 这样的 API 网关,并配置它们来认证使用 JWT 令牌的传入请求。这些网关都配有插件来验证 JWT。
🔒 设置身份验证策略:
使用令牌作用域来定义针对特定路由的访问控制。例如,处理订单创建的路由可以需要 "write:orders" 这一作用域。
🔒实现速率限制功能并且进行流量控制
:
这通过为每个令牌设置了API调用限制次数并实施配额来防止滥用。
- 步骤四 — 安全通讯
🔒启用 HTTPS
确保到和来自网关和所有服务的所有流量都使用 HTTPS 安全传输数据。
🔒IP白名单配置和防火墙设置
通过仅允许白名单中的IP地址访问,并使用防火墙,来限制对您的认证服务器和微服务的访问。
🔒使用mTLS进行服务通信
:
为了提高安全性,特别是在处理敏感交易时,配置 mTLS(Mutual Transport Layer Security,双向传输层安全),确保客户端和服务器互相验证对方的证书。
- 步骤五 — 与微服务对接
🔒传递 JWT 的声明
配置 API 网关,将 JWT 令牌中验证后的声明转发给微服务,可以通过头部信息或通过 JWT 令牌中的自定义声明来实现。
🔒服务级别权限
:
每个微服务都应该检查用户的权限范围(scope)是否符合其内部的权限规则,以增加安全性考虑。例如,订单服务可以确保只有读取订单权限的用户不能进行写入操作(write operations)。
🔒实施令牌撤销策略
:
确保服务定期验证令牌的活动状态,特别是在使用长期有效的访问令牌时。定期向IdP
验证令牌可以解决令牌被撤销或过期的问题。
- 步骤六 — 监控并维护
🔒记录并监控登录尝试
收集认证相关的事件日志以便监控异常情况。
🔒定期审计并轮换密钥
确保定期按照规定的安全密钥轮换策略来轮换JWT使用的签名密钥。
🔒:可扩展性规划方案
:
选择可以根据公司需求扩缩的负载均衡器和API网关配置,如果有需要的话,还可以包括区域复制。
一些示例工具和技术🔒 认证服务器:
Keycloak, Auth0 或自建的 OIDC 服务器(基于 Node.js 和 node-oidc-provider)
🔒API Gateway
:Kong,NGINX,AWS API Gateway
用户管理数据库:PostgreSQL 或本地使用 MySQL
🔒服务间通信
: 使用 gRPC 或 REST over mTLS 进行服务间通信,其中 mTLS 是互相传输层安全的缩写,便于更广泛的受众理解。
为了探索 API 集成测试的方法,Postman 提供了一个专门的 集成测试套件。这个套件允许你在沙盒环境中测试 API 端点,验证响应结构,并处理可能出现的错误情况。该套件使用 postman-integration-testing.glitch.me
作为测试服务器,在那里你可以安全地发送请求并验证响应数据,而不会影响实时系统。
🔒 查看收藏
:
您可以使用其中一个可用的集成测试集合链接,这些链接包含预先配置好的请求以简化设置过程。
🔒分支并运行测试
:
将这个集合fork到您的工作空间。使用Postman的脚本工具,您可以使用ChaiJS BDD语法编写JavaScript,让添加针对响应、头部、cookie等的断言变得轻松简单。
🔒查看控制台中的结果
为了详细查看,Postman的控制台功能提供了每个请求和响应的日志,帮助你调试并验证请求之间信息的流动。
此集成测试设置支持自动测试,帮助确保所有服务都已正确连接和运行良好。
要运行此集合,请点击运行按钮。所有测试都应顺利通过,确认令牌已被成功创建并随后撤销,这验证了令牌创建和清理过程的成功。
可以参阅我的测试用控制台输出。
POST https://postman-integration-testing.glitch.me//register
200
1189毫秒
POST //register HTTP/1.1
User-Agent: PostmanRuntime/7.42.0
Accept: */*
Cache-Control: no-cache
Postman-Token: afacd8c8-2113-4538-8e51-973f65c09e60
Host: postman-integration-testing.glitch.me
Accept-Encoding: gzip, deflate, br
Connection: keep-alive
Content-Length: 0
HTTP/1.1 200 OK
Date: Mon, 28 Oct 2024 12:41:36 GMT
Content-Type: application/json; charset=utf-8
Content-Length: 48
Connection: keep-alive
{"token":"876797e8-8049-40ca-8408-ef2bf51f2b67"}
GET //my-name?token=876797e8-8049-40ca-8408-ef2bf51f2b67 HTTP/1.1,
200
345毫秒
User-Agent: PostmanRuntime/7.42.0
Accept: */*
Cache-Control: no-cache
Postman-Token: 590e2844-e027-430b-bf81-c0dc36826fc1
Host: postman-integration-testing.glitch.me
Accept-Encoding: gzip, deflate, br
Connection: keep-alive
HTTP/1.1 200 OK
Date: Mon, 28 Oct 2024 12:41:37 GMT
Content-Type: application/json; charset=utf-8
Content-Length: 37
Connection: keep-alive
{"name":"雷鸣般的卑微成长"}
POST https://postman-integration-testing.glitch.me//unregister
200
273毫秒
POST //unregister HTTP/1.1
Content-Type: application/json
User-Agent: PostmanRuntime/7.42.0
Accept: */*
Cache-Control: no-cache
Postman-Token: 889b7fa4-beb1-4b87-888e-102e1d194d06
Host: postman-integration-testing.glitch.me
Accept-Encoding: gzip, deflate, br
Connection: keep-alive
Content-Length: 55
{
"token": "876797e8-8049-40ca-8408-ef2bf51f2b67"
}
HTTP/1.1 200 OK
Date: Mon, 28 Oct 2024 12:41:37 GMT
Content-Length: 0
Connection: keep-alive.
这就是我对可扩展性微服务架构中API网关的介绍结束啦!
如果你觉得这有用,不妨给个赞或者在评论区分享你的想法,我很期待你的回复 🤗。
参考与致谢API网关及其接待员示例 发布于,由 MOHIT MISHRA
OAuth 2.0 解释图 👌 SVG
揭秘OAuth 2.0流程:释放版 — 包含Google认证(Docker化)— oauth2-node-api-v2 由 j3 提供
简洁的任务列表:
1. 认证服务器:设置一个身份提供程序(如Keycloak、Auth0),并启用OAuth 2.0和OIDC来颁发JWT,并定义范围(例如,read:orders、write:orders)。
2. 令牌管理:配置JWT,包含用户角色、范围、过期时间,并使用(如RS256或ES256)安全签名。
3. API网关设置:使用Kong、NGINX或AWS API Gateway来验证令牌、强制执行范围,并进行限流和节流。
4. 安全通信:强制使用HTTPS、IP白名单和mTLS来保证服务间通信的安全。
5. 微服务集成:转发JWT声明,针对每个服务验证权限,并定期检查令牌状态。
6. 监控与维护:记录活动、轮换密钥,并配置网关以根据需求进行扩展或缩容。
图片来自这个链接 链接,请看致谢和参考文献部分。
在接下来的教程中我们会讲Keycloak。(Keycloak,一个开源的身份和访问管理平台)等一下……
共同学习,写下你的评论
评论加载中...
作者其他优质文章