当授权服务器位于代理后面时,如何与Auth0中的令牌交换授权代码

时间:2019-01-12 16:03:59

标签: nginx reverse-proxy auth0 netflix-zuul

我正在开发一个Spring Boot Web应用程序,该应用程序托管在Zuul反向代理服务器后面,并且API网关是nginx。所有应用程序都在同一虚拟机(NginX,Zuul和“我的应用”)上运行 Nginx执行SSL终止,而zull负责请求身份验证和授权。我正在使用OpenID Connect通过Auth0进行用户身份验证。

请求流程

Browser --(A)--> NginX --(B)--> Zuul --(c)--> My Application

A-带有域名的https呼叫,例如:https://example.com

B-本地运行的Zull服务器的http调用,例如: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上注册并用于获取授权代码的内容)。因此,系统总是抛出错误。

我可以通过删除nginx服务器并直接将zuul服务器放在前面来使它工作(然后没有url更改)。有什么办法可以使用我现有的配置来完成这项工作。

谢谢

1 个答案:

答案 0 :(得分:0)

目前看来,此问题无法解决,因为将令牌交换为授权代码的请求内置在Auth0提供的库中。(mvc-auth-common-1.0.2.jar)< / strong>。回调网址是通过调用 req.getRequestURL()。toString()生成的。

由于请求是由nginx代理发送到zull服务器的,因此请求url始终为https://127.0.0.1:7070

为了获得成功,我不得不使用一些技巧。我使用自定义的http请求包装器包装了请求对象。

const textToFind = $('#test').text();
const exists = Array.prototype.some.call(
  $('.title'),
  title => $(title).text() === textToFind
);
if (exists) {
  console.log('exists');
}

在这里,我返回所需的网址。

<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
<div class='title'>lorem</div>
<div class='title'>ipsum</div>
<div class='title'>lorema</div>
<div class='title'>ipsuma</div>

<div id='test'>lorem</div>

现在,只要调用方法 getRequestURL()方法,我的域名就会被传递。