使用来自 node.js 的凭据反向代理登录
Posted
技术标签:
【中文标题】使用来自 node.js 的凭据反向代理登录【英文标题】:Reverse Proxy login with credentials from node.js 【发布时间】:2017-02-09 14:21:39 【问题描述】:我目前有一个在 Tomcat servlet 中运行 Spring 的服务器,它带有 Shiro Token 系统,用于检查用户是否已经登录。它允许跨域请求。
在我可以在客户端(通常使用角度)调用的任何其他域中...
http.get('https://<my_check_login_service>', withCredentials: true)
...只要我已经登录(令牌不会过期)返回用户信息(姓名、头像等)。
我现在有另一个系统,它是一个节点服务器(也为客户端提供角度服务),我想为其调用节点服务器并将其代理到上述 my_check_login_service 到获取用户,设置会话对象的信息(使用 express),然后将用户返回给客户端。而且,通过会话对象,允许我信任他们的连接,并允许他们根据从登录服务返回的用户的安全级别执行进一步的 api 调用。
在 node.js 路由器上,我可以代理这样做...
app.get('/checklogin', function(req, res)
req.pipe(request.get("https://<my_check_login_service>").pipe(res);
...但我不知道如何将正确的凭据传递给服务。如果我这样做......
http.get('checkLogin', withCredentials: true)
...当然,它不起作用,因为我的 login_service 的凭据没有发送到本地服务器。如何传递正确的凭据来完成这项工作?
干杯。
【问题讨论】:
【参考方案1】:凭证最有可能在 HTTP 标头中,传递所有标头(来自请求和响应)以及原始请求的地址,应该可以使其工作:
app.get('/checklogin', function(req, res)
console.dir(req.headers)
//You can inspect the headers here and pass only required values
const options =
url: 'https://<my_check_login_service>',
headers: Object.assign(
//Tell the login service about address of original request
'X-Forwarded-For': req.connection.remoteAddress
req.headers)
req.pipe(request.get(options))
.on('response', (response) => res.set(response.headers))
.pipe(res)
此示例通过设置X-Forwarded-For
传递原始地址,login_service
可能会识别它...或不识别它,具体取决于配置。
【讨论】:
是的!谢谢!我不完全确定它会起作用,因为我现在意识到我可能需要一个通配符证书才能使它适合我。但是有了这个更改,我现在得到“错误:主机名/IP 与证书的替代名称不匹配:...”我假设通配符证书可以解决这个问题。当我把它摆平时会更新这个。login_service
还会检查客户端 IP 地址,因此代理应该通过它。我将其添加到答案中
很遗憾这不起作用。添加标头至少让服务器知道一些信息,但不会传递登录所需的安全令牌。我认为我想做的事情是不可能的,我只需要实现一个 OAuth 系统。如果在赏金到期之前我没有得到其他答案,我肯定会给你。谢谢你。 :)
“错误:主机名/IP 与证书的替代名称不匹配:...”看起来像 SSL 错误。从nodejs服务器向<my_check_login_service>
发出请求时,您是否使用相同的主机名和端口,就像您从客户端(角度)使用一样,例如不在节点服务器上与某些本地 IP 交换域名?我建议在上面的脚本中尝试的另一件事是从 options.headers
中删除 Host
标头(假设 nodejs 将从登录请求 URL 中填写正确的标头),因为现在看起来你正在传递你的 nodejs服务器主机到登录服务器,这可能会混淆 SSL 检查。
是的,在服务器代码中使用与客户端相同的域名。您是否建议我尝试使用本地 IP 地址?以上是关于使用来自 node.js 的凭据反向代理登录的主要内容,如果未能解决你的问题,请参考以下文章