openid-connect
openid-connect 插件支持与 OpenID Connect (OIDC) 身份提供商(IdP)集成,例如 Keycloak、Auth0、Microsoft Entra ID、Google、Amazon Cognito、Okta 等。它允许 APISIX 在允许或拒绝客户端访问上游受保护资源之前,对其进行身份认证并从身份提供商获取其信息。
示例
授权码流程
授权码流程在 RFC 6749, Section 4.1 中定义。它涉及将临时授权码交换为访问 Token,通常用于机密客户端和公共客户端。
下图说明了在实现授权码流程时不同实体之间的交互:
当传入请求的请求头或相应的会话 Cookie 中不包含访问 Token 时,插件将充当依赖方,并重定向到授权服务器以继续授权码流程。
身份认证成功后,插件将 Token 保存在会话 Cookie 中,后续请求将使用存储在 Cookie 中的 Token。
参见使用 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 起支持。
在此工作流中,网关是向授权服务器发起 Token 请求和用户信息请求的 DPoP 客户端。它不会验证外部客户端调用受保护路由时提交的 DPoP 证明。
对于 APISIX 部署,请参阅使用 PAR 和 DPoP 保护 OIDC,其中提供了经过验证的 Keycloak 示例,涵盖密钥生成、配置和验证。
客户端凭据流程
客户端凭据流程在 RFC 6749, Section 4.4 中定义。它涉及客户端使用自己的凭据请求访问 Token 以访问受保护资源,通常用于机器对机器的身份认证,不代表特定用户。
下图说明了使用本地 JWT 验证(例如配置 public_key 或 use_jwks)实现客户端凭据流程时,不同实体之间的交互:
参见使用 Keycloak 对 M2M 请求进行授权,了解如何使用 openid-connect 插件通过客户端凭据流程与 Keycloak 集成,并在本地验证 JWT。
内省流程
内省流程在 RFC 7662 中定义。它涉及通过查询授权服务器的内省端点来验证访问 Token 的有效性和详细信息。
在此流程中,当客户端向资源服务器出示访问 Token 时,资源服务器向授权服务器的内省端点发送请求,如果 Token 处于活动状态, 该端点将响应 Token 详细信息,包括 Token 过期时间、关联的范围以及它所属的用户或客户端等信息。
下图说明了在实现带有 Token 内省的授权码流程时不同实体之间的交互:
参见使用 Keycloak 对 M2M 请求进行授权,了解如何使用 openid-connect 插件通过客户端凭据流程与 Keycloak 集成,并使用 Token 内省。
刷新 Token 授予
刷新 Token 授予在 RFC 6749, Section 6 中定义。客户端可以使用之前颁发的刷新 Token 请求新的访问 Token,而无需用户再次进行身份认证。能否使用刷新 Token 及其生命周期取决于授权服务器,以及最初颁发 Token 时采用的流程。
用户信息
OpenID Connect (OIDC) 中的 UserInfo 端点在 OpenID Connect Core 1.0, Section 5.3 中定义。它使客户端能够通过出示有效的访问 Token 来检索有关已认证用户的其他 Claim。此端点对于在用户通过身份认证后获取用户个人资料信息(如姓名、电子邮件和其他属性)特别有用。UserInfo 端点返回的数据取决于访问 Token 的范围和授权 服务器配置的 Claim。
下图说明了当 APISIX 验证用户信息时不同实体之间的交互:
参见根据 OIDC 用户组控制访问,了解如何使用 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 会话,该流程可以在无需再次提示用户的情况下完成。