他日若能阅此文,跨站登录不求人

2017-01-13 10:54:54来源:csdn作者:booljiaoyu人点击

前言

昨天朋友问我如何做到两个不同的站点之间的一次性认证,我说搞台服务器单独做一个登录系统,存储会话,其他站点只需要认可通过这台服务器的验证不就可以了吗?最后还跟人说用Memcache或者Redis来存储会话Session效果更好。

回头想想,自己有点站着说话不嫌腰疼。人家只是想简简单单地实现一个跨站登录的效果,你硬给人整个添加服务器的方案。不妥,对于一个初创企业来说,无异于雪上加霜。撸主小时候就有科技报国的抱负,加台服务器浪费钱还费电,最主要的是浪费社会主义资源,这事咱不能干。但是吧,除了这法子,我也不会其他的啊。闹心,那只刚点燃的香烟被撸主狠狠掐灭。所以这个技术问题咱要弄明白,至少思维理论上是通的,这不研究稍有成果,不敢独断专享,遂撰文与朋友们分享交流。

登录认证

这里要强调一点,看我的这篇博文,我默认你已经具备了基本的PHP知识。所以如果你感觉,不知所云,可以去自学网 http://www.zixue.it/修炼一下PHP内功。

既然我们讲登录认证,那么有两点必须搞清楚:

(1) 拿什么认证? (2) 用什么规则认证?

拿什么认证

布尔教育在给学生讲解博客项目实战时,涉及到登录验证技术时,我们通常的做法是使用Cookie去验证。说到这里,吃瓜的群众肯定诧异了,什么?你用Cookie做Ticket(小票)来验证用户的合法性?万万不可,你不知道Cookie是可以伪造的吗?

(^__^) 嘻嘻……,知道呀。但是撸主可以对它进行加密,让你伪造Cookie无”迹”可寻,不就行了。这里既然涉及到了加密,撸主又要多说几句了,对Cookie的加密你可以选取2种方式,对称加密和非对称加密,如果你使用了对称加密,那么加密和解密的秘钥是相同的,比如我们常用的md5()就是对称加密。若是非对称加密算法,加密时使用私钥,解密时使用公钥。只要我们的加密算法和私钥不被泄漏,那么这个加解密体系就是安全的。所以说,你没必要去过多地担心Cookie的安全,而忽略了项目的进度。

用什么规则认证

我们今天要实现的效果是多个站点一次登录,这里可能有的吃瓜群众想歪了,撸主你是不是要讲企鹅认证授权登录啊?我看到企鹅号可以在很多网站登录,你要是这样想,撸主真为你捉急,朋友你的那个技术点是OAuth,开放授权协议。咱们今天要讲的知识点是跨站登录。

这里关于跨站登录,我们从其技术特点分析,可以分为两类:跨子域单点登录和完全跨单点域登录。

跨子域单点登录

跨子域,这里的子域就是子域名。如果有朋友对子域,顶级域不是很了解的话,我这里再说一遍,其实我们布尔教育PHP大狮班的博客实战项目中也有讲到,大家可以自行了解。

顶级域也称之根域,就拿我们布尔教育的域名来说吧。

看了这张图,不知道哥们儿姐们儿有没有学会区分呢?

如果这个时候,你还是不太清楚,那么我们一起找规律,域名中有N个点(.)就是N级域名,这下总会了吧。

好,我们接着细说跨子域单点登录。

这里有两个站点,一个站点的域名是dengpeng.itbool.com,我们暂且称之为D站,另一个站的域名是yanshiba.itbool.com,我们且称之为Y站。如何做到D站登录验证用户合法性,获得小票Cookie后,访问Y站时不需要登录认证呢?

我们都知道,Cookie是有域的限制的,不能跨域访问浏览器中的Cookie值。比如,我们在D站中登录验证后,获得小票,Cookie的域被设置成dengpeng.itbool.com,当我们紧接着去访问yanshiba.itbool.com站点时,浏览器无法携带D站给的小票去请求Y站。我们总说Cookie是一张Ticket,拿不到它也就无法利用算法对其做真伪的鉴别。

不!用!怕!

我们的Cookie域名参数是可以设置顶级域的,当我们把Cookie域设置成D站和Y站的顶级域itbool.com时,itbool.com的任何子域都是可以读取这张小票的。有了Cookie小票,在利用我们的解密算法对Cookie值进行解密,比对,就能很容易地判断用户的登录状态。

Cookie域

关于上面顶级域(根域)的具体值的设置,可以有两种写法。


法一:itbool.com 法二:.itbool.com


完全跨单点域登录

既然是完全跨域,那就是一组不相干的域名。itbool.com和zixue.it是北京零一科技有限公司的两个不同服务站点,那么我接下来实现itbool.com站点登录后,在访问zixue.it站点时不需要二次验证?这个撸主犯难了,这完全是就是两个不想干的域名,设置根域也没用啊!这可如何是好。

你先别急,我们一起来看看这张请求认证流程图。

这种登录认证的核心技术就是来回重定向进行认证。

重定向登录

基本原理就如上图所示,我这里再来利用文字描述下:

当你访问布尔站点(itbool.com)时,看你有没有itbool_ticket,如果有且验证小票(ticke)正确,那么布尔站点就认为你有权限访问该站点的相关资源。如果没有,那么会重定向到自学站点(zixue.it),因为我们是单点登录(只要有一个站点登录其他站点就不再需要登录验证了),所以需要去看看自学站点是否登录,如果登录了自学站点能拿到zixue_ticket,且验证通过,那么这个时候会携带一串加密的Token,也可能是加密的Cookie值,重定向到布尔站点,布尔验证通过后,会给浏览器一个itbool_ticket的Cookie。如果自学站点没有登录,就会重定向到自学的登录页,登录完成后,携带加密的Token重定向到布尔站点,布尔验证后,然后在浏览器写入itbool_ticket。

这里我要重申一下:

上图中访问itbool.com跟zixue.it,无论谁先谁后,其基本流程都是一致的。

站群共享身份认证系统

好了,关于这2种单点登录技术我已经讲完了。至于第三种,就是独立出一个用户登录系统,做成一个独立的应用,这个应用什么事都不干,专门做用户登录认证的业务。这在本文开头我已经有所叙述。该技术的应用常见于大型的站群系统,比如企鹅,谷歌。

为了让大家更直观地了解,认证信息共享系统,我贴出网络图片。

共享身份认证系统

课后选读

如果大家想更多地研读单点登录技术的相关应用,我这里给大家推荐两个人气型产品,一个是Discuz的UCenter,另一个是PHPCMS的PHPSSO。


附上文档地址:


UCenter http://faq.comsenz.com/library/UCenter/introduction/introduction_brief.htm PHPSSO http://v9.help.phpcms.cn/html/phpsso/


最新文章

123

最新摄影

微信扫一扫

第七城市微信公众平台