微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

重写授权标头,在Nginx Plus中验证jwt之前修复错字

如何解决重写授权标头,在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验证发生之前重写标头?

已经问过,我目前的解决方法是设置两个位置,一个将重写标头,并且不验证令牌,然后代理到另一个位置,该位置将检查修改后的标头并将其代理到其目的地。这是个好方法吗?

谢谢!

解决方法

这是我要做的解决方法:

  1. 在http块中重写设置标头,以确保承载词和令牌之间有空格:
map "$http_authorization" $authorization {
    ~*^bearer(\s*)(?<token>(.*))$ "bearer $token";
    default $http_authorization;
}
  1. 从一个位置到另一个位置的代理,一个未经身份验证的将重写标头,然后代理到另一个实际进行身份验证的位置:
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; 

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 [email protected] 举报,一经查实,本站将立刻删除。