首页 > 解决方案 > 如何使用 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 标头。我是否有任何错误配置?如何调试这个问题?

标签: apacheoauth-2.0mod-auth-openidc

解决方案


我正在使用 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 应用程序的过程中仍然存在。


推荐阅读