将外部认证的用户信息转发到上游
在使用 OpenID Connect 或 SAML Auth 等认证插件时,你 可能需要将经过身份验证的用户信息传递给上游服务。这使上游应用程序能够基于用户身份实现额外的业务逻辑,例如个性化、审计和访问控制。
本指南以 Azure AD (Microsoft Entra ID) 作为示例身份提供商。
本指南涵盖了两种解决方案:
- 将消费者名称与外部身份验证关联:将解析后的用户标识符(例如,
sub或name_id)设置为当前请求的consumer_name。 - 将用户信息请求头转发到上游:通过自定义请求头将解析后的用户信息传递给上游服务。
前置条件
创建路由
在 API7 控制板中为你想要保护的上游服务创建一个路由。

将消费者名称与外部身份验证关联
身份验证成功后,openid-connect 和 saml-auth 都会将用户信息存储在 ctx.external_user 中。配置 serverless-post-function 使其在 rewrite 阶段运行,并将其放置在路由上的认证插件之后,以便 ctx.external_user 已被填充。
使用 OpenID Connect
配置 OpenID Connect 插件
登录到 Azure 门户,转到 App registrations 服务并注册一个新应用程序。

在 IdP 和插件中配置重定向 URI:

将 token 版本设置为 v2:

从 IdP 复制客户端信息(如 client_id 和 client_secret)。以下示例仅用于演示,请勿使用真实凭证:


在路由上配置 openid-connect 插件。请将高亮的配置替换为你自己的值:
openid-connect
bearer_only: false
client_id: de90e86d-d632-4861-99cf-4a97fb2482fe
client_secret: <YOUR_CLIENT_SECRET>
discovery: https://login.microsoftonline.com/a7a70f5e-0b17-4a67-90ab-9e85ff6d9f59/v2.0/.well-known/openid-configuration
redirect_uri: https://your-gateway.com/anything/callback
required_scopes:
- openid
scope: openid email profile
session:
secret: <YOUR_SESSION_SECRET>

使用 serverless-post-function 设置 consumer_name
使用 ctx.external_user 中解析的 sub 来设置请求的 consumer_name:
serverless-post-function
phase: rewrite
functions:
- |
return function(conf, ctx)
local core = require("apisix.core")
core.log.warn(
"ctx.external_user: ",
core.json.encode(ctx.external_user, true)
)
if type(ctx.external_user) == "table" and ctx.external_user.sub then
ctx.consumer_name = ctx.external_user.sub
core.log.warn("consumer_name: ", ctx.consumer_name)
end
end

验证
在浏览器中访问路由以完成 OpenID Connect 身份验证:

检查网关访问日志以验证 consumer_name 已被设置:
