API 网关专栏 · 第 23

API 网关身份验证:在 Apache APISIX 中集成 OAuth 2.0、JWT 和 OIDC

2025年04月03日
API 网关身份验证:在 Apache APISIX 中集成 OAuth 2.0、JWT 和 OIDC

简介

Apache APISIX 是一款高性能的 API 网关,提供强大的身份验证机制,包括 OAuth 2.0、JWT 和 OIDC。本文将介绍如何配置 Apache APISIX,使用这些身份验证协议来保障 API 的访问安全。

为什么身份验证在 API 网关中至关重要

身份验证确保只有经过授权的客户端才能访问 API,从而提供:

  • 访问控制:限制仅允许已通过身份验证的用户访问。
  • 安全合规:保护敏感的 API 数据。
  • 单点登录 (SSO):提升用户体验。
  • 委托授权:允许第三方应用代表用户执行操作。

Why Authentication Matters in API Gateways

Apache APISIX 中的身份验证机制

1. 在 Apache APISIX 中使用 OAuth 2.0 身份验证

Apache APISIX 通过验证由外部身份提供商 (IdP)(如 Keycloak、Auth0 或 Okta)签发的令牌来支持 OAuth 2.0。

启用 OAuth 2.0 身份验证

要在 Apache APISIX 中配置 OAuth 2.0 身份验证:

  1. 启用 authz-keycloak 插件
  2. 设置你的 OAuth 2.0 提供商(本例中为 Keycloak)。
  3. 定义身份验证和授权端点。
1{
2  "route": {
3    "uri": "/secure-api",
4    "plugins": {
5      "authz-keycloak": {
6        "token_endpoint": "https://auth.example.com/realms/demo/protocol/openid-connect/token",
7        "authorization_endpoint": "https://auth.example.com/realms/demo/protocol/openid-connect/auth",
8        "client_id": "your-client-id",
9        "client_secret": "your-client-secret",
10        "scopes": ["read", "write"]
11      }
12    },
13    "upstream": {
14      "type": "roundrobin",
15      "nodes": {
16        "backend-service:80": 1
17      }
18    }
19  }
20}

工作原理

  1. API 客户端从 OAuth 提供商获取访问令牌。
  2. 客户端在 API 请求中附带该令牌(例如,Authorization: Bearer <token>)。
  3. Apache APISIX 会在将请求转发至后端服务之前验证该令牌。

2. 在 Apache APISIX 中使用 JWT 身份验证

JWT (JSON Web Token) 身份验证支持无状态的令牌验证,无需请求外部服务器。

启用 JWT 身份验证

  1. 启用 jwt-auth 插件
  2. 配置用于签名 JWT 的密钥。
  3. 为身份验证定义特定于用户的令牌。
1{
2  "consumer": {
3    "username": "api-user",
4    "plugins": {
5      "jwt-auth": {
6        "key": "api-user-key",
7        "secret": "super-secret-key",
8        "algorithm": "HS256"
9      }
10    }
11  }
12}

JWT 令牌示例

使用 HS256 编码的 JWT 令牌示例:

1{
2  "alg": "HS256",
3  "typ": "JWT"
4}.
5{
6  "sub": "1234567890",
7  "name": "API User",
8  "iat": 1712012345,
9  "exp": 1712617145
10}.
11<signature>

工作原理

  1. 客户端发送请求,并在 Authorization 请求头中附带 JWT 令牌。
  2. Apache APISIX 解码该令牌并验证其签名。
  3. 如果验证通过,则将请求转发至后端服务。

3. 在 Apache APISIX 中使用 OIDC 身份验证

OIDC 扩展了 OAuth 2.0 的功能,增加了身份验证机制,允许使用外部 IdP 进行身份验证。

启用 OIDC 身份验证

  1. 启用 openid-connect 插件
  2. 配置 OIDC 提供商的发现端点。
1{
2  "route": {
3    "uri": "/oidc-secure",
4    "plugins": {
5      "openid-connect": {
6        "client_id": "your-client-id",
7        "client_secret": "your-client-secret",
8        "discovery": "https://auth.example.com/.well-known/openid-configuration",
9        "scope": "openid profile email"
10      }
11    },
12    "upstream": {
13      "type": "roundrobin",
14      "nodes": {
15        "backend-service:80": 1
16      }
17    }
18  }
19}

工作原理

  1. 客户端会被重定向至 OIDC 提供商进行身份验证。
  2. 身份验证完成后,提供商会返回一个 ID 令牌。
  3. Apache APISIX 会验证该令牌并提取用户身份声明。

Apache APISIX API 身份验证最佳实践

  • 使用 OAuth 2.0 和 OIDC 进行基于身份的身份验证。
  • 启用 JWT 验证 以减少对外部身份验证服务器的调用频率。
  • 配置限流,对身份验证端点进行流量控制。
  • 监控身份验证日志,以便进行安全审计。
  • 使用 mTLS(双向 TLS) 来保障令牌验证请求的安全。

Best Practices for API Authentication in Apache APISIX

总结

Apache APISIX 提供了一个灵活的身份验证框架,支持集成 OAuth 2.0、JWT 和 OIDC。通过实施这些身份验证机制,企业可以在保障无缝用户体验的同时,提升 API 的安全性。

常见问题 (FAQ)

1. Apache APISIX 可以作为 OAuth 2.0 授权服务器吗?

答:不可以。Apache APISIX 仅负责验证 OAuth 令牌,你需要一个外部的授权服务器(例如 Keycloak、Auth0)。

2. Apache APISIX 如何验证 JWT 令牌?

答:APISIX 会解码 JWT 并使用预定义的密钥或公钥来验证签名。

3. 必须使用 OpenID Connect 进行身份验证吗?

答:不是必须的,但是 OIDC 提供了身份信息,这在许多身份验证场景中非常有用。

微信咨询

获取方案