如何解决重写授权标头,在Nginx Plus中验证jwt之前修复错字
我有一个面向应用程序的Nginx Plus(R22)网关,该网关正在验证Authorization标头中的JWT令牌。最近,我发现我们的一个旧版移动应用程序存在一个错误,其中的授权标头中有一个错字:它在Bearer关键字和令牌之间缺少空格。 (例如:bearereyJ ...)
我使用了一个简单的地图来确保添加一个空格,并将其设置在$ authorization变量中,该变量可以正常工作:
map "$http_authorization" $authorization {
~*^bearer(?<token>(.*))$ "bearer $token";
default $http_authorization;
}
我还在自己的位置设置了Authorization标头,但我的请求仍然被拒绝,即使查看后该令牌仍然有效,我仍然收到401。
location ~ ...{
proxy_set_header Authorization $authorization;
proxy_pass ...;
}
如何确保在JWT验证发生之前重写标头?
已经问过,我目前的解决方法是设置两个位置,一个将重写标头,并且不验证令牌,然后代理到另一个位置,该位置将检查修改后的标头并将其代理到其目的地。这是个好方法吗?
谢谢!
解决方法
这是我要做的解决方法:
- 在http块中重写设置标头,以确保承载词和令牌之间有空格:
map "$http_authorization" $authorization {
~*^bearer(\s*)(?<token>(.*))$ "bearer $token";
default $http_authorization;
}
- 从一个位置到另一个位置的代理,一个未经身份验证的将重写标头,然后代理到另一个实际进行身份验证的位置:
location ~ ... {
auth_jwt off;
proxy_set_header Authorization $authorization;
proxy_pass http://$upstream/reauthenticate/$request_uri;
}
location ~ /reauthenticate/(?<original_uri>(.*)){
proxy_pass http://$upstream/$original_uri;
}
,
虽然我们最终没有使用此解决方案,但我确实认为最好将它放在某个地方,以防将来有人在寻找它。这是我一直在寻找的更好的解决方案,它将避免使用499状态代码:
map $http_authorization $token {
"~^Bearer\s?(.+)$" $1;
}
...
auth_jwt "test" token=$token;
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。