我正在开发一个spring boot web应用程序,该应用程序托管在Zuul反向代理服务器后面,API网关是nginx。所有应用程序都运行在相同的虚拟机上(NginX、Zuul和My App)。Nginx负责SSL终止,zull负责请求身份验证和授权。我使用OpenID连接通过Auth0进行用户身份验证。
请求流程
Browser --(A)--> NginX --(B)--> Zuul --(c)--> My ApplicationA- https域名调用,如:https://example.com
B- http调用本地运行的Zull服务器例如:http://127.0.0.1:7070
在nginx服务器中,我给出了一个规则,将所有流量转发到本地运行的Zull服务器
https://example.com --> http://127.0.0.1:7070
通过这种配置,回调URL在Auth0被设置为https://example.com/callback,一旦回调url被调用,它就会以不同的名称被发送到zuul服务器。
https://example.com/callback?code=sf4sf4ds4fdf --> http://127.0.0.1:7070/callback?code=sf4sf4ds4fdf我使用了Auth0提供的库来将授权码转换为令牌。但是在这一点上,令牌的请求包含的回调url是http://127.0.0.1:7070/callback而不是https://example.com/callback (这是我在Auth0注册并用于获取授权码的url)。因此,系统总是抛出错误。
我可以通过移除nginx服务器并直接将zuul服务器放在最前面(这样就没有url更改)来让它正常工作。有没有什么方法可以让我的现有配置工作。
谢谢
发布于 2019-01-13 15:46:47
目前,这个问题似乎无法解决,因为将令牌交换为授权代码的请求是构建在Auth0 (mvc-auth-common-1.0.2.jar).提供的库中的回调url是通过调用req.getRequestURL().toString().生成的
因为请求是由nginx代理发送到zull服务器的,所以请求url总是https://127.0.0.1:7070。
为了成功,我不得不使用一些技巧。我使用自定义的http请求包装器包装了请求对象。
import javax.servlet.http.HttpServletRequestWrapper;
class CustomRequesWrapper extends HttpServletRequestWrapper {
public CustomRequesWrapper(HttpServletRequest request) {
super(request);
}
@Override
public StringBuffer getRequestURL() {
return new StringBuffer("https://example.com/callback");
}
}在这里,我返回所需的url。
// Tokens tokens = controller.handle(req); -- previous code
Toke tokens = controller.handle(new CustomRequesWrapper(req)); // current code现在,每当调用方法getRequestURL()方法时,都会传递我的域名。
https://stackoverflow.com/questions/54161329
复制相似问题