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是否也存在安全漏洞?同时不能公开令牌吗?
答案 0 :(得分:1)
事实证明,这是受受保护的应用程序端上的配置问题,该问题还涉及其他Keycloak适配器,例如Java Servlet Filter适配器或Spring adapter。
默认情况下,任何受保护的应用程序都将忽略X-Forwarded-Proto
标头。
使用的Web框架(例如Express)需要进行配置,以考虑代理标头。
对于Express,the documentation指出应用程序应该信任代理,例如:
app.set('trust proxy', 'loopback');
对于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中一样。