将外部认证用户信息转发到上游
使用 openid-connect 或 saml-auth 保护路由时,API7 网关会先对请求进行身份认证,再将其代理到上游。有时上游服务还需要知道请求来自哪个用户。
两个插件都会将已认证用户存储在 ctx.external_user 中。可以配合 serverless-post-function 使用该值:
- 设置
ctx.consumer_name,使日志和其他插件能够使用此身份。 - 为上游服务添加请求头。
对于 OpenID Connect,插件已经可以通过请求头转发用户信息和令牌。需要设置 consumer_name 或为 SAML 构建自定义请求头时,请使用 serverless-post-function。
前置条件
- API7 企业版实例正在运行。
- 已创建网关组且网关实例正在运行。
- 已从控制台获取令牌。
- 路由已配置
openid-connect或saml-auth,且端到端身份认证成功。有关 OpenID Connect,请参阅 OAuth 2.0 和 OIDC。
设置消费者名称
在同一路由的 rewrite 阶段添加 serverless-post-function。默认情况下,它在 openid-connect 和 saml-auth 之后运行,因此函数执行时 ctx.external_user 已填充。如果自定义过插件优先级,请验证执行顺序。
以下函数对 OpenID Connect 使用 sub,对 SAML 使用 name_id,并将其写入 ctx.consumer_name:
serverless-post-function
phase: rewrite
functions:
- |
return function(conf, ctx)
local user = ctx.external_user
if type(user) ~= "table" then
return
end
local id = user.sub or user.name_id
if id then
ctx.consumer_name = id
end
end
配置下发到网关后,通过路由发送已认证请求。其他插件随后可以读取 ctx.consumer_name。如果希望在访问日志中记录该值,请在日志格式中包含 consumer_name。