现有系统A,系统B,B系统要使用A系统的用户体系。员工张三在A系统存在账号。现要实现,张三可以使用A系统的账号登录B系统。类似于第三方网站可以使用QQ账号或者Sina微博账号登录。
总体思路
1、在B系统登录页面,放置“使用A系统账号登录”链接,点击该链接,跳转至A系统的登录页面,并传递参数ticket_consume_url和random_code。
》ticket_consume_url表示在A系统登录成功后,A系统需要生成登录票据ticket,并且需要以重定向的方式将登录票据ticket传递给B系统的票据消费地址ticket_consume_url。
》random_code是由B系统随机生成的一个随机码,该随机码会在B系统的当前session中保存一份,当用户在A系统登录成功后,重定向至B系统的票据消费地址ticket_consume_url时,会将该random_code包含在ticket中带回。
》登录票据ticket由用户uid、随机码、时间戳,经“|”拼接后,再经可逆加密算法(如AES)加密而成。
2、B系统接收到登录票据ticket后,调用A系统的rest服务对ticket进行解密,解密后分别取得uid、时间戳、random_code。
3、B系统首先检查本地session中的random_code与解密出的random_code是否相同,如相同,则进一步检查时间戳与系统当前时间的时间差,如不超过5分钟,则认为该ticket有效,否则视为无效。
4、如果ticket有效,则B系统进一步检查ticket中的uid是否已经与B系统中的账号进行绑定(B系统需要新建用户映射表,用于保存本系统账号与外部系统账号的映射关系),如果已绑定,则直接创建绑定的B系统账号的会话。如果未绑定,则进入绑定页面,在绑定页面,用户输入B系统的账号、密码,如果账号密码匹配,则将该账号与ticket中的uid进行绑定,绑定成功,创建该账号的会话。
流程图
1、用户在系统B页面点击“使用系统A账号登录”,浏览器发起请求到系统B。
2、系统B接收到请求后,封装ticket_consume_url和random_code参数,通过浏览器将请求重定向至系统A。
3、响应A系统的登录页面。
4、用户填写在A系统的账号密码,提交登录请求。
5、登录成功,取得当前用户的uid,拼接random_code和时间戳后,经过AES加密,得到ticket,并通过浏览器重定向到系统B的ticket_consume_url。
6、系统B从请求中取得ticket后,调用系统A的rest服务对ticket进行解密,检查解密出的random_code是否与本地session中的一致,检查时间戳是否已过期。
7、检查ticket中的uid是否已经与B系统中的账号绑定,如果已绑定,则直接根据绑定的账号创建系统B的会话,如果未绑定,则响应绑定页面。