从 Nginx 隐藏密码查询参数 error_log

Hide password query param from Nginx error_log

我使用 Oauth2 密码授权为我的客户生成访问令牌。这意味着用户的密码作为查询参数发送:

example.com/oauth/token?grant_type=password&username=MyUsername&password=MyPassword

我使用以下 log_filter 来屏蔽来自 Nginx access_log 的身份验证尝试的密码:

http {
    log_format hide_password '$remote_addr $remote_user [$time_local] "$request_without_password" $status $body_bytes_sent "$http_referer" "$http_user_agent"';

    ...

    server {
        set $request_without_password $request;
        if ($request_without_password ~ (.*)password=[^&]*(.*)) {
            set $request_without_password password=****;
        }
        access_log /var/log/nginx/access.log hide_password;

        ....
    }
}

我现在已经使用 Nginx limit_req 引入了速率限制。所有限速请求都记录到 Nginx error_log。问题是似乎不可能在 error_log 上使用 log_filter,这意味着速率受限的身份验证请求将在用户密码可见的情况下被记录下来,这当然是不可接受的。因为我想跟踪限速请求,所以我不想禁用 error_log.

有没有办法在 Nginx 中记录速率受限的请求,而密码不可见作为查询参数?

这并不意味着密码需要作为查询参数发送,密码不应该作为查询参数发送。这些值应该在正文中发送,完全按照原样 specified in the Oauth protocol:

The client makes a request to the token endpoint by adding the
following parameters using the "application/x-www-form-urlencoded"
format per Appendix B with a character encoding of UTF-8 in the HTTP
request entity-body:

grant_type REQUIRED. Value MUST be set to "password".

username REQUIRED. The resource owner username.

password REQUIRED. The resource owner password.

scope OPTIONAL. The scope of the access request as described by Section 3.3.

另见 the example in the same section of the Oauth specification:

 POST /token HTTP/1.1
 Host: server.example.com
 Authorization: Basic czZCaGRSa3F0MzpnWDFmQmF0M2JW
 Content-Type: application/x-www-form-urlencoded

 grant_type=password&username=johndoe&password=A3ddj3w

所以,按照标准——不要放在查询参数中,就不会出现这个问题。