apache - 如何使用 mod_auth_openidc 将用户声明传递给上游层?
问题描述
我已经使用 Auth0 和 Google App Oauth 成功地使用 mod_auth_openidc 配置了 apache Web 服务器来保护我们的内部仪表板,如本文档中所述:- https://github.com/zmartzone/mod_auth_openidc#openid-connect-sso-with-google -登录 - https://auth0.com/docs/quickstart/webapp/apache/01-login (不使用auth0规则管道)
我的问题是如何将用户的声明作为 http 标头传递给上游层(我们的内部工具/仪表板)?是否可以?
问候, 阿贡
更新
我已经尝试过这里的建议,这是我的 /etc/apache2/sites-available/000-default.conf 的片段
<VirtualHost *:443>
ServerName my-host-name
UseCanonicalName on
ProxyPreserveHost on
DocumentRoot /var/www/html
# Pass the user's claim as http headers
OIDCPassClaimsAs "headers"
OIDCPassUserInfoAs "claims"
OIDCPassRefreshToken "On"
<Location />
AuthType openid-connect
<RequireAll>
Require claim email~^(.*)@domain.com$
Require claim email_verified:true
</RequireAll>
ProxyPass http://echo-server.default.svc.cluster.local:8080/
ProxyPassReverse http://echo-server.default.svc.cluster.local:8080/
LogLevel debug
</Location>
</VirtualHost>
我使用 echoserver (gcr.io/google_containers/echoserver:1.0) 作为http://echo-server.default.svc.cluster.local:8080的后端,并且它不会将任何用户的声明打印为 http 标头。我是否有任何错误配置?如何调试这个问题?
解决方案
我正在使用 docker 映像 httpd:2.4-buster,从 Debian 包 repo 安装 libapache2-mod-auth-openidc 版本为 2.3.10,并代理对子位置(不是 /)的请求。LogLevel auth_openidc:debug
我通过添加来打开调试httpd.conf
,然后我看到了 set-header 和 set-env 调用声明的痕迹。但是使用上面的设置,我无法观察到任何 OIDC 设置的标头到达代理的 Python Flask WSGI 应用程序。
我的解决方法是将环境变量转换为标题。<Location>
我在 REST API 路径的块内添加了以下配置行,它位于<VirtualHost>
Apache HTTPD 配置块内:
# module sets REMOTE_USER as env var
RequestHeader set X-Forwarded-User-Email %{REMOTE_USER}s
# module sets OIDC_CLAIM_sub as env var
PassEnv OIDC_CLAIM_sub
RequestHeader set X-Forwarded-User %{OIDC_CLAIM_sub}e
然后应用程序获取用户名和完全限定的 user@host.domain 作为请求标头。
更新:通过@ https://github.com/zmartzone/mod_auth_openidc/discussions/705的讨论获得了@hans-z 的进一步帮助
那次讨论告诉我,WSGI http 服务器会默默地删除名称中包含下划线的所有标头!另一种解决方案(而不是将环境变量转换为标头)是在 httpd.conf 文件中更改 mod-auth-openidc 前缀字符串,如下所示:
OIDCClaimPrefix Oidc-Claim-
然后由 mod-auth-openidc 设置的所有标头在进入代理 Flask + WSGI 应用程序的过程中仍然存在。
推荐阅读
- ios - 即使在暗模式打开时,iOS 上的平台亮度仍然很亮 - Flutter
- javascript - 根据黑名单检查具有多个单词的术语的有效方法
- r - 使用 R 和 multtest 校正置换过程中的多重比较
- python - 看门狗观察者不处理所有文件
- flutter - Flutter RangeError(索引):无效值:有效值范围为空:0
- javascript - ChartJS - 使用 datalabels 插件切断标签
- sql - 在 SQL Server 2017 中修改多个 JSON 数组元素
- python - 在 Python 中使用来自 2 个不同列表的参数同时并行运行 2 个函数
- parsing - 如何删除批处理文件中的整行并将其重新转换为输出文件?
- r - 带填充的 R 条形图