赞
踩
单独使用keycloak进行sso,在本地可以正常的单点登录。
但部署到nginx,并且经过spring gateway时,却在输入用户名、密码之后抛出401错误码,提示no state cookie。
经观察,发现正常情况下单点登录的请求url和参数中redirect_url是一致的,而经过nginx和spring gateway之后,请求的url和redirect_url不一样。
由于技术栈不够深,导致一开始想的是改源码,从而使得请求的url和redirect_url保持一致。
虽然源码改了,也实现了url和redirect_url一致,但是依然是401和no state cookie。
最终发现实际并不需要如此麻烦的改源码,只需要使keycloak识别到的request中remoteAddr和请求url一致即可。
于是只需要保证nginx中有ip的转发配置,以及gateway中有隐藏真实ip的配置就可以了。
nginx中必要配置如下:
proxy_set_header Host $http_host; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forward-For $proxy_add_x_forwarded_for; proxy_set_header HTTP_X_FORWARDED_FOR $remote_addr;
以上配置需要注意,如果是经过了多层nginx路由,则层层都要有次配置。
gateway中必要配置如下:
zuul.add-host-header=true
后来有一个header参数转发不了的问题,也需要注意gateway需要如下参数:
zuul: sensitive-headers: add-proxy-headers: true
https请求,根据不同的场景需要,有双向认证和单向认证。
而不论单向还是双向,客户端对服务端证书的处理都有两种方式可选,一是完全信任,即忽略对服务端证书的校验,另一个就是需要校验服务端证书。
根据个人的理解,从一个https请求发起,到真正开始传递业务数据,以nginx作为服务器的大概流程应该如下图,以作记录:
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。