Keycloak NodeJS适配器会忽略X-Forwarded-Proto

时间:2018-12-06 14:02:54

标签: node.js single-sign-on keycloak

keycloak-connect是Keycloak文档中的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)。

如果这是故意的,而不是错误,那么即使客户端重定向到HTTPS,在redirectUri中使用HTTP是否也存在安全漏洞?同时不能公开令牌吗?

1 个答案:

答案 0 :(得分:1)

事实证明,这是受受保护的应用程序端上的配置问题,该问题还涉及其他Keycloak适配器,例如Java Servlet Filter适配器或Spring adapter

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

NodeJS

使用的Web框架(例如Express)需要进行配置,以考虑代理标头。

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

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

Java适配器

对于Spring,在 application.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" /> 

也可以在 Keycloak的过滤器适配器之前实现新的Servlet过滤器,该适配器在{strong> web.xml 中注册,就像在this example中一样。