“号外号外,惊天大消息,人类要开始做SSO系统啦”。一大清早就听见PHP在哪里吆喝道。
“大清早还让不让人睡觉了”,C恶狠狠的说。“虽说你是世界上最好的语言,但是也别到处卖弄啊,SSO是个什么鬼,说人话”
PHP:大傻帽,SSO都不知道啊。Single Sign One 啊。单点登录啊。
C:哈哈哈哈哈哈哈哈哈。让我笑一会儿。不是就个登录么?至于说的这么高大上啊。你去看看用我写的订单系统去,每天有多少人登录。他们想访问我的系统时,必须输入用户名和密码,然后我进行验证,验证通过后我就在我这边建立一个叫做session的东西,然后把sessionId通过cookie发送给浏览器,下次他们在登录的时候会带着cookie一起发过来,我从cookie中拿到sessionId就知道他们已经登录啦。通过cookie和session就可以把无状态通信的转换成有状态的啦,是不是so easy啊。C说完满脸自豪的样子。
PHP:你说的登录没问题啊,可是人们并不是每天只支付你的订单系统哦。他们可能还需要登录用户系统,可能还需要登录库存系统呢。比如说有个叫小明的用户登录了你的订单系统,然后想去看库存系统,发现又让登录,再次输入用户名密码,然后又去登录用户系统,又输一次用户名密码,去访问财务系统,有来一遍。。。。。如果有一万个服务需要访问,那估计别干别的啦。
C:这个这个这个。。。
PHP:是吧,本来就是同一个用户,不论是访问订单系统也好,库存系统也罢,都是我们自己内部的系统,所以在一个地方登陆了就能自动登陆别的系统不就好了么。这就是人类要开始搞SSO得原因喽。
C:哇,果然是高大上的样子。可是要怎么实现呢?感觉超级难得样子呢。
PHP:你刚刚不是还洋洋得意的把登录的原理说了一遍么,自己好好想想呢。
C:嗯。对。登录就是通过cookie和session来实现有状态的。我可以把cookie做共享啊。登录完订单系统之后我就有了cookie,去登录库存系统的时候我把cookie带过去不就行了么?
PHP:NO! NO!NO! 你这样是有问题得。1,cookie是不能跨域的,比如说a.com产生的cookie是不能传递给b.com的。2,就算cookie可以带过来了,可是库存系统并没有session啊,如何验证呢?
C:这个简单啊。1,我们可以让所有的系统都挂在同一个一级域名下啊。比如我叫a.corp.com,库存系统叫b.corp.com,财务系统叫c.corp.com,这样cookie不就能共享了嘛。2,既然cookie能共享,那session当然也能共享。之前把session存在自己的内存里,别人拿不到,我从内存里拿出来放在一个大家都能拿到的地方不就行了么?就像下面这样。哈哈哈我是不是很聪明。
这个时候一旁的Java终于按奈不住了:你的系统中可能有很多个系统,而且各自实现的语言可能也不尽相同,有用C++的,有用PHP的,有用GO的,也有用Java的,共享session就会显得很麻烦啦。各个系统还得自己维护用户。其实啦,人们做SSO的初衷就是想消除多账号的问题,不用各自系统维护用户的信息。他们将会建立一个统一的认证中心,所用的用户的认证工作都交给这个认证中心来完成就OK啦。
PHP和C:哇。好高大上哦,大佬,给我们讲讲呗。
JAVA:看你们这么好学,听我娓娓道来。
比如说现在用户第一次像订单系统发起了访问:www.a.corp.com,这个时候订单系统发现用户没有登录的话,那他需要做的一项操作就是重定向认证中心:www.sso.com/login?redirect=www.a.corp.com。其中www.sso.com/login就是认证中心的登录地址,redirect=www.a.corp.com就是登录完成后需要跳转到的地址。在认证中心登录之后认证中心会做以下几件事情:
1,建立一个session
2,发放ticket
3,重定向到你的地址,并在浏览器种下cookie信息。注意这个cookie是sso服务器的cookie哦。如:ssoid=1,domain=sso.com
大致流程如下:
需要注意的有两点:
1,进行了两次重定向哦。第一次是重定向到SSO的服务器,第二次是重定向我们的后端服务器。
2,流程完成后再浏览器种了两个cookie,一个是sso服务器的cookie,一个是订单系统的cookie。
PHP和C听毕,拍手称快:大哥真不愧是世界上最好的语言呢。C接着问,那接着库存系统会发生什么呢?
Java:这个简单啊。还记得上面在浏览器的cookie吗?看下面的流程。
你俩想想,这个流程之后浏览器会有几个cookie呢?
PHP和C争先恐后的喊道:我知道我知道。应该是有三个的。一个是认证中心SSO的cookie: domain sso.com,一个是订单系统的cookie:a.corp.com,还有一个是库存系统的cookie:domain b.corp.com。实质上就是保存了一个认证中心的cookie和多个子系统的cookie而已啦
Java:孺子可教也。一般我们称SSO的cookie的对应的会话成为全局会话,各自子系统cookie对应的会话称为局部会话。
PHP和C:听起来是高大上,不会感觉好绕啊。又是各种重定向,又是各种cookie的,我们都懵逼了,实现起来岂不是更加的困难了。
Java:你们真是out啊,听说过CAS(Central Authentication Service)吗?耶鲁大学提出的一套关于SSO的解决方案,现在都已经广泛的推广啦。大家都在用啦。
PHP和C听毕,感叹道:学无止境啊。比我优秀的人都还在不断进步,我们还有不学习的道理啊。