SSO 登陆简单实现
SSO又称单点登录。简单的说就是多个站点应用(域名不一定在同一个主域名下),在任意一 个子系统中登录,其他系统都实现登陆。同样,一个站点退出,其他站点也退出。
SSO 登录的难点在于如何保持多个系统同步。
实现SSO登陆的步骤如下:
-
子系统点击登陆,带上redirect作为返回路径跳转到sso统一登录页面(passport)进行 登录。
-
用户在passport登录之后(写入passport的session,cookie等登录信息),通过js向各个 子系统的登录接口(并带上passport的临时票据ticket)
-
子系统的登录接口中,确定请求的合法性,并根据请求的临时票据ticket请求passport服务器获 取用户信息(这里是服务器跟服务器直接通讯,因此passport需要能够根据ticket获取到用户信息), 并将用户信息写入登陆状态中,登录用户,写子系统的session,cookie
-
所有子系统写完之后,根据一开始请求passport的跳转参数redirect进行跳转条主, 回到登录前的子系统
退出过程:
-
子系统点击退出,跳转到passport的退出操作,并生存退出票据ticket
-
passport退出页面中可通过ajax请求各个子系统
-
各个子系统判断ticket的合法性,退出用户
上面的就是整个sso的过程,其实这里面还有一些方面没处理。所有的登录登出操作都是在 passport处理的,因此数据同步是单项性的。如果各个登录登出操作是在每个子系统本身处 理的,那就需考虑client到passport的状态同步。同时,单点登录系统需要对参数进行加密, 子系统和passport直接可以根据同样的key对参数进行ras加密,保证数据传输过程中不被破解
个人代码可参见github
评论