注意:以下为个人构思,尚未验证和分析其实际可操作性。
今天忽然想到了“Passport”。
普通的网站登陆,都是用户提交登陆的信息,然后由网站的程序通过数据库去验证,如果确认了,就保存一个COOKIES或者SESSION,然后用户和站点之间就可以通过SESSION来确认用户的身份了。
而PASSPORT,就是希望用户的多个系统,使用同一套用户验证信息,就比如说,用户如果登陆了BLOG系统,然后要去访问BBS系统的时候,就不用再登陆了,直接访问就可以。
Passport最难的就是跨域认证的问题。因为如果两个系统都在同一个域名系统下(比如 [url]www.wozhai.com[/url])那么,几个系统是可以通过访问同一个SESSION来直接知道,这个访问者的身份。
如果是两个域名(比如 [url]www.wozhai.com[/url]search.wozhia.com),两个域名之间是不能访问一个SESSION的(即使同一台服务器也不行)。因为安全的考虑,而且COOKIES也是不能互相访问的。
看了很多资料,现在很多大的公司都使用很复杂的办法,实现了这个功能。但是作为广大的中小企业,普通爱好者,特别是我这样的程序开发的“半路出家”者。就感觉太高难了。那么是否有一个非常简单的方法实现这个功能呢?
以下就是我的全套解决方案。非常简单。
1、架设一个PASSPORT服务器 (该服务器命名为A)。所有的用户验证都通过此服务器验证,其他服务器对用户信息的获取,用户的身份确认,都要通过这个服务器来实现。
2、在应用服务器(该服务器命名为B)的所有需要验证的地方判断用户信息是否已经验证,如果没有验证,则通过 IFRAME 在用页面放一个A服务器的验证页面,并传递一个A可以识别的标记参数,告诉A服务器是B服务器需要验证当前用户。
3、A服务器获得B服务器的页面请求后,首先检查当前用户是否登陆,如果没有登陆,则停止验证,或者反馈一个尚未登陆的页面。
4、如果A用户收到B服务器的也面请求后,发现当前用户已经登陆,则生成一个随机的长的字符串并在记录下该字符串、生成时间、对应的用户记录、B服务器的标记。然后通过自动跳转技术,访问B服务器上的一个用户信息验证页面,同时传递所生成的长字符串。(该页面由A从自身记录中获取,由事先录入);
5、B服务器的验证页面收到到所传递的长字符串后,在服务器端访问A服务器的服务器端信息确认页面,同时传递所收到的长字符串以及服务器标识。
6、A服务器的服务器端信息确认页面收到信息后,通过字符串与发出请求的服务器来验证信息的正确性:(1)、首先判断服务器IP是否属于该PASSPORT的服务服务器列表;(2)、通过字符串查询记录中是否有该字符串;(3)通过请求服务器的IP与保留的服务器标记核对,看是否请求的IP地址是当前记录的服务器的;(4)判断字符串的生成时间与当前时间比较,是否超时,超时的设置,在A服务器上设置;(5)如果都核对无误,则返回对应的用户信息,否则反馈错误信息;
7、B服务器受到A服务器的确认信息后,根据确认信息的内容,判断用户是否登陆成功,如果登陆成功,则给当前用户分配SESSION。如果不成功,则返回空白或者重复刚才的进程,重新验证(重新验证需要记录次数,当次数超过一定量,则无条件停止验证,避免死循环)
PS:对于退出的管理,尚未找到一个非常好的办法。