openid-connect
openid-connect 插件支持与 OpenID Connect (OIDC) 身份提供商(IdP)集成,例如 Keycloak、Auth0、Microsoft Entra ID、Google、Amazon Cognito、Okta 等。它允许 APISIX 在允许或拒绝客户端访问上游受保护资源之前,对其进行身份认证并从身份提供商获取其信息。
示例
授权码流程
授权码流程在 RFC 6749, Section 4.1 中定义。它涉及将临时授权码交换为访问令牌,通常用于机密客户端和公共客户端。
下图说明了在实现授权码流程时不同实体之间的交互:
当传入请求的请求头或相应的会话 Cookie 中不包含访问令牌时,插件将充当依赖方,并重定向到授权服务器以继续授权码流程。
身份认证成功后,插件将令牌保存在会话 Cookie 中,后续请求将使用存储在 Cookie 中的令牌。
参见使用 Keycloak 设置 SSO,了解如何使用 openid-connect 插件通过授权码流程与 Keycloak 集成。
参见使用 PAR 和 DPoP 保护 OIDC,了解如何使用 openid-connect 插件通过 PAR、DPoP、PKCE 和 private_key_jwt 客户端身份认证与 Keycloak 集成。
用于代码交换的证明密钥 (PKCE)
用于代码交换的证明密钥 (PKCE) 在 RFC 7636 中定义。PKCE 通过添加代码挑战和验证器来增强授权码流程,以防止授权码拦截攻击。
下图说明了在实现带有 PKCE 的授权码流程时不同实体之间的交互:
参见使用 Keycloak 设置 SSO,了解如何使用 openid-connect 插件通过带有 PKCE 的授权码流程与 Keycloak 集成。
结合 PAR 和 DPoP 的授权码流程
PAR、PKCE、private_key_jwt 和 DPoP 可以组合在同一个授权码流程中。请分别配置用于客户端身份认证和 DPoP 的签名密钥。此工作流自 API7 企业版 3.9.18 和 3.10.5 以及 APISIX 3.18.0 起支持。
在此工作流中,网关是向授权服务器发起令牌请求和用户信息请求的 DPoP 客户端。它不会验证外部客户端调用受保护路由时提交的 DPoP 证明。
对于 APISIX 部署,请参阅使用 PAR 和 DPoP 保护 OIDC,其中提供了经过验证的 Keycloak 示例,涵盖密钥生成、配置和验证。
客户端凭据流程
客户端凭据流程在 RFC 6749, Section 4.4 中定义。它涉及客户端使用自己的凭据请求访问令牌以访问受保护资源,通常用于机器对机器的身份认证,不代表特定用户。
下图说明了使用本地 JWT 验证(例如配置 public_key 或 use_jwks)实现客户端凭据流程时,不同实体之间的交互:
参见使用 Keycloak 对 M2M 请求进行授权,了解如何使用 openid-connect 插件通过客户端凭据流程与 Keycloak 集成,并在本地验证 JWT。
内省流程
内省流程在 RFC 7662 中定义。它涉及通过查询授权服务器的内省端点来验证访问令牌的有效性和详细信息。
在此流程中,当客户端向资源服务器出示访问令牌时,资源服务器向授权服务器的内省端点发送请求,如果令牌处于活动状态,该端点将响应令牌详细信息,包括令牌过期时间、关联的范围以及它所属的用户或客户端等信息。
下图说明了在实现带有令牌内省的授权码流程时不同实体之间的交互:
参见使用 Keycloak 对 M2M 请求进行授权,了解如何使用 openid-connect 插件通过客户端凭据流程与 Keycloak 集成,并使用令牌内省。
刷新令牌授予
刷新令牌授予在 RFC 6749, Section 6 中定义。客户端可以使用之前颁发的刷新令牌请求新的访问令牌,而无需用户再次进行身份认证。能否使用刷新令牌及其生命周期取决于授权服务器,以及最初颁发令牌时采用的流程。
用户信息
OpenID Connect (OIDC) 中的 UserInfo 端点在 OpenID Connect Core 1.0, Section 5.3 中定义。它使客户端能够通过出示有效的访问令牌来检索有关已认证用户的其他 Claim。此端点对于在用户通过身份认证后获取用户个人资料信息(如姓名、电子邮件和其他属性)特别有用。UserInfo 端点返回的数据取决于访问令牌的范围和授权服务器配置的 Claim。
下图说明了当 APISIX 验证用户信息时不同实体之间的交互:
参见通过检查外部身份提供商的用户信息控制访问,了解如何使用 openid-connect 插件与 Keycloak 集成,并基于用户信息使用 API7 企业版 acl 插件实现访问控制。
故障排除
本节涵盖了在使用此插件时常见的一些问题,以帮助您进行故障排除。
APISIX 无法连接到 OpenID 提供商
如果 APISIX 无法解析或无法连接到 OpenID 提供商,请仔细检查配置文件 config.yaml 中的 DNS 设置,并根据需要进行修改。
授权回调中的 State 不匹配
授权状态完成、被重放或被删除后,回调仍可能到达。自 API7 企业版 3.9.18 和 3.10.5 以及 APISIX 3.18.0 起,Multi Auth 之外过期的 GET 回调会重定向到最初请求的 URL,从而启动新的身份认证流程。如果身份提供商 中仍存在 SSO 会话,该流程可以在无需再次提示用户的情况下完成。
使用其他 HTTP 方法、无法恢复目标 URL 或在 Multi Auth 中运行的回调仍会失败,而不会重定向。
身份提供商暂时不可用
在 APISIX 3.18.0 中,如果授权回调包含 OAuth 错误 temporarily_unavailable,且其 state 可以验证,则回调会重定向到最初请求的 URL。这样会重新启动身份认证流程,而不是返回 500 Internal Server Error。
其他 OAuth 错误、缺失或无效的 state,以及非 GET 回调不会自动重试。
找不到会话状态
如果您在使用 授权码流程 时遇到 500 internal server error 并在日志中看到以下消息,可能有多种原因。
the error request to the redirect_uri path, but there's no session state found