密钥罩节点JS适配器忽略X-Forwarded-Proto [英] Keycloak NodeJS adapter ignores X-Forwarded-Proto

查看:24
本文介绍了密钥罩节点JS适配器忽略X-Forwarded-Proto的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

keycloak-connect是密钥罩文档中的recommended NodeJS adapter,当受保护的应用程序位于Apache反向代理之后时,它不会考虑X-Forwarded-Proto标头。

实际上,redirectUri是这样构建的:

let host = request.hostname;
let headerHost = request.headers.host.split(':');
let port = headerHost[1] || '';
let protocol = request.protocol;*
let hasQuery = ~(request.originalUrl || request.url).indexOf('?');

let redirectUrl = protocol + '://' + host + (port === '' ? '' : ':' + port) + (request.originalUrl || request.url) + (hasQuery ? '&' : '?') + 'auth_callback=1';

request.protocol由于反向代理,始终为"http",因此redirectUri没有预期的协议(HTTPS)。

如果这是故意的,而不是bug,那么即使客户端重定向到HTTPS,在redirectUri中使用HTTP也是一个安全缺陷吗?不能在此期间暴露令牌吗?

推荐答案

原来是受保护的应用程序端的配置问题,它还与Java Servlet Filter适配器或Spring adapter等其他密钥罩适配器有关。

默认情况下,任何受保护的应用程序都将忽略X-Forwarded-Proto头。

NodeJS

需要将使用的Web框架(如Express)配置为将代理头考虑在内。

对于Express,the documentation表示应用程序应该信任代理,例如:

app.set('trust proxy', 'loopback');

Java适配器

对于Spring,在applation.properties

中,需要进行的配置很少,如per the docs
server.tomcat.remote-ip-header=x-forwarded-for
server.tomcat.protocol-header=x-forwarded-proto 

对于Java servlet过滤,有几种解决方案:

可以将Tomcat阀门添加到server.xml

<Valve className="org.apache.catalina.valves.RemoteIpValve" 
           internalProxies="127.0.0.1" 
           remoteIpHeader="x-forwarded-for" 
           proxiesHeader="x-forwarded-by" 
           protocolHeader="x-forwarded-proto" /> 

还可以实现新的Servlet过滤Keyloak的过滤适配器之前,在web.xml中注册,就像this example中一样。

这篇关于密钥罩节点JS适配器忽略X-Forwarded-Proto的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆