http-headers - 使用 unbase64 转换请求标头和环境变量不起作用
问题描述
我无法使用 Apache 对请求标头进行 base64 解码。
用例:
传入请求具有基本身份验证标头:
"Authorization: Basic user:api_key"
其中 'user:api_key' 是 base64 编码的。
在将请求传递到后端服务器之前,我需要将标头转换为以下内容(使用 mod_proxy_http):
"Authorization: Bearer api_key"
其中 'api_key' 不是 base64 编码的。
大多数步骤可以使用“标题编辑”和一些带有正则表达式匹配和使用匹配组的 SetEnvIf 来完成。
我无法实现的是解码基本身份验证字符串并在 / 标头中使用它。
我努力了:
SetEnvIf Authorization "Basic\ (.*)" "AUTH64=$1"
Header set my_header %{AUTH64}e
这工作正常,但不解码。(只需使用 my_header 响应标头即可使用 curl 轻松调试)
尝试解码:
SetEnvIf Authorization "Basic\ (.*)" "AUTH64=$1"
Header set my_header %{unbase64:%{AUTH64}e}
SetEnvIf Authorization "Basic\ (.*)" "AUTH64=$1"
Header set my_header %{unbase64:env:AUTH64}
SetEnvIf Authorization "Basic\ (.*)" "AUTH64=$1"
Header set my_header %{unbase64:%{AUTH64}}
SetEnvIf Authorization "Basic\ (.*)" "AUTH64=%{unbase64:$1}"
Header set my_header %{AUTH64}e
SetEnvIf Authorization "Basic\ (.*)" "AUTH64=%{unbase64($1)}"
Header set my_header %{AUTH64}e
SetEnvIf Authorization "Basic\ (.*)" "AUTH64=$1"
Header set my_header "expr=%{unbase64:%{AUTH64}e}"
SetEnvIf Authorization "Basic\ (.*)" "AUTH64=$1"
Header set my_header "expr=%{unbase64:env:AUTH64}"
SetEnvIf Authorization "Basic\ (.*)" "AUTH64=$1"
Header set my_header "expr=%{unbase64:%{AUTH64}}"
这些都无法解码错误,或者标头中的值类似于
"my_header: unbase64:dXNlcjpwYXNz"
起作用的是:
Header set my_header "expr=%{unbase64:dXNlcjpwYXNz}"
因此,唯一缺少的步骤是使用环境变量中的值,而不是我在上面最后一个示例中硬编码的文字 base64 编码值。
我还尝试了一些带有重写规则的选项,但我遇到了同样的问题,即未评估 unbase64。
在职的:
RewriteCond %{HTTP:Authorization} ^Basic\ (.*)
RewriteRule ^(.*) $1 [E=AUTH64:%1]
不工作:
RewriteCond %{HTTP:Authorization} ^Basic\ (.*)
RewriteRule ^(.*) $1 [E=AUTH64:unbase64(%1)]
RewriteCond %{HTTP:Authorization} ^Basic\ (.*)
RewriteRule ^(.*) $1 [E=AUTH64:%{unbase64:%1}]
当我用谷歌搜索时,我几乎找不到任何使用 unbase64 的例子。唯一可行的例子是有人使用带有重写规则的外部程序,但这似乎有点过头了。
我的用例可以使用 Apache 吗?
谢谢,
瓦伦廷
解决方案
您遇到的问题是在您的 apache 配置中组合 2 个模块。我有可能 env 模块在头模块之后执行。
在 apache wiki 上有一个与您尝试做的目的相同的示例:https ://cwiki.apache.org/confluence/display/HTTPD/LogBasicauthenticationusername
在应用程序中输出标头并在响应标头中设置输出的工作示例:
# Set the Auth header to custom one.
RequestHeader set X-AUTH-DECODE "expr=%{HTTP:Authorization}"
# Grab the base 64 part
RequestHeader edit X-AUTH-DECODE "^Basic (.*)$" $1
# decode it
RequestHeader set X-AUTH-DECODE "expr=%{unbase64:%{HTTP:X-AUTH-DECODE}}"
# split on :
RequestHeader edit X-AUTH-DECODE "(.*):.*$" $1
# Set response header
Header onsuccess set X-AUTH-DECODE "expr=%{HTTP:X-AUTH-DECODE}"
问候,埃格伯特
推荐阅读
- spring - 使用 H2 的 Java Spring 项目中的查询问题
- encryption - 通过网络在两台设备之间共享公钥 [RSA]
- python - 在进程之间共享布尔值
- c# - 如何将数据库表与excel与c#中的相同列进行比较?
- php - Opencart 控制器数据未在视图中定义
- ios - UIImagePickerController 没有选择图像
- c++ - OpenCV 中的 findContours 与 Matlab 中的 bwboundaries 不匹配?
- ruby-on-rails - 如何获取活动存储视频附件的持续时间?
- security - 将多部分表单数据(POST)发送到多部分表单数据(GET)的任何方式
- batch-file - 如何拖放多个文件?