首页 > 解决方案 > 使用 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 吗?

谢谢,

瓦伦廷

标签: http-headersapache2

解决方案


您遇到的问题是在您的 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}"

问候,埃格伯特


推荐阅读