在笔者先前的文章——《基于saml2.0的平台(适用多种平台)单点登录配置,以okta为例》中,详细介绍了如何把一个自开发的三方系统,集成到okta或者IAS平台。
经过笔者的实际工作经验,发现SF自己本身其实也可以作为一个单点登录平台来使用。
具体场景:
自开发的三方系统(JAVA)需要和SF系统进行单点登录集成,在前面的文章中,我们为了和SF系统集成,是通过外部的单点登录平台IAS来实现的,在这里其实是可以一步到位直接和SF进行集成的。
因为SF自身也是一个产品,它也提供了类似于单点登录平台的作用,所以可以不需要IAS平台,直接在SF自身的平台配置单点登录。
解决方法:
下面介绍下具体的方法。
SF的单点登录配置特别简单,首先登录SF专用的配置网址。
再进入特定的配置界面:
第一步:这里的重点就是截图中文字描述的,首先下载idp认证服务器的xml,其实就是认证服务器的公钥证书,下载到自开发服务器后,以后的单点登录认证就通过这个idp来完成。
第二步:配置SSO参数,可以参考上一篇文章,基本保持一致,这里不需要把自开发服务生成的metadata.xml文件上传到这里单点配置。
SF单点登录与IAS平台级配置区别:
上面介绍的都是很简单的配置,只要详细的看完了上一篇文章,这个配置就没问题。
这里重点说一下SF单点登录和IAS单点登录配置的不同之处。
最大的不同在于,当在自开发项目中,当调用单点登录接口/saml/login成功后会通过浏览器自动跳转到/saml/SSO。问题的关键在于请求的域名和http方式,如果是IAS平台集成,会跳转到IAS平台自己配置好了前缀的/saml/SSO接口,比如https://ias.idp.com/saml/SSO。
但是如果是SF的单点登录配置,它不会自动的按照SF平台配置的/saml/SSO链接调用,它只会根据当前自开发服务器的ip地址来自动跳转比如:http://10.10.10.10:80/saml/SSO。
在平时的开发中,其实都好说,主要是当需要生产上线的情况,需要通过域名和证书访问。
这时候SF却不能够像IAS一样,只要在SSO配置的地方配置好就行,只能通过代码的形式来实现把本机ip替换成指定的域名和端口。
这里的解决方法是通过Nginx请求头配置和Tomcat的流程引擎——RemoteIpValve来控制,在tomcat执行请求的过程中,把本地ip替换成指定的域名。
关于tomcat的RemoteIpValve流程引擎原理,也有一篇专门的文章讲解,有兴趣可以去看看。
下面说下具体的解决办法:
Nginx配置:
location / {
#请求使用https
proxy_set_header X-Forwarded-Proto https;
#本机ip替换为指定域名
proxy_set_header X-Forwarded-Host test.baidu.com;
#使用指定的端口
proxy_set_header X-Forwarded-Port 8082;
proxy_pass http://10.10.10.10:8090;
}
Tomcat配置:
server:
tomcat:
remoteip:
protocol-header: X-Forwarded-Proto
protocol-header-https-value: https
就这样,通过Nginx在请求头配置一系列指定的参数,可以把tomcat接收到的请求http://10.10.10.10:80/saml/SSO,直接动态转换为https://test.baidu.com:8082/saml/SSO。
这样就直接解决了在SF单点登录之初,从saml/login无法转向我们需要的saml/SSO请求的问题。