用户X在A系统浏览器端请求接口1要求登陆到系统B,A系统检测到用户X还没有登陆到B系统的认证密钥R,于是A系统产生 TOKEN 1,让用户X的浏览器跳转页面到B系统登陆绑定接口,B系统在后台使用该TOKEN 1 直接跟 系统A 进行确认验证TOKEN 1是不是A系统合法的TOKEN。如果是则A系统会告知B系统此TOKEN对应的A系统用户名X和认证密钥(如没有则为空)。
B系统在验证TOKEN 1合法之后,检查A系统返回的用户名X和认证密钥R是否存在、是否和自己存储的密钥一致,如果一致则取出里面B系统已被绑定的用户信息,调用SecurityUtils.getSubject().login(username, password)进行登录,并且跳转到b/home.jsp!
B系统检测如果TOKEN1合法,且A系统返回的用户名X和认证密钥不存在,那么则让用户X浏览器跳转到登录绑定页面,验证用户X在B系统的用户名密码和其他必要的信息。
在用户X绑定到B系统的过程中,B系统首先要验证用户输入的B系统的用户信息的正确性,验证通过之后,则在后台调用A系统,将TOKEN1和新产生的TOKEN2、A系统用户名、B系统用户名返回给A系统。
A系统对TOKEN1和A系统用户名进行校验,正确之后则存储TOKEN2(替换1)和B系统用户名,TOKEN1不合法则返回认证失败给B系统,B系统通知用户认证失败。
下次用户X再通过A系统请求快捷进入B系统时,A系统将使用TOKEN2和B系统做认证用户X,用户X可以快捷的登陆到B系统。
这种办法是服务器之间双向认证证明是自己人,用户无法抵赖,两个系统之间不需要交换用户的密码,可以支持用户一对一的任意绑定。
如果只是部署一套,则上面的流程允许A系统用户快捷登陆到B系统,而B系统用户则无法快捷的登陆A系统。