使用来自 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服务器向&lt;my_check_login_service&gt;发出请求时,您是否使用相同的主机名和端口,就像您从客户端(角度)使用一样,例如不在节点服务器上与某些本地 IP 交换域名?我建议在上面的脚本中尝试的另一件事是从 options.headers 中删除 Host 标头(假设 nodejs 将从登录请求 URL 中填写正确的标头),因为现在看起来你正在传递你的 nodejs服务器主机到登录服务器,这可能会混淆 SSL 检查。 是的,在服务器代码中使用与客户端相同的域名。您是否建议我尝试使用本地 IP 地址?

以上是关于使用来自 node.js 的凭据反向代理登录的主要内容,如果未能解决你的问题,请参考以下文章

如何编写一个 HTTP 反向代理服务器

nginx使用反向代理支持node.js服务

如果Node.js已具备反向代理的功能,我为什么要使用反向代理?

安装Nginx并为node.js设置反向代理

Node.js API 网关和 nginx 作为反向代理

Nginx 反向代理 Serving Node.js app 静态文件