本文目的
SSO(Single sign-on)单点登入,主要应用跨系统认证。公司内部的系统(km,bbs等等)都是采用此方式提供登入服务。最近的工作需要自己调用OA SSO服务,所以将OA SSO的验证流程记录下来,作为备忘。
OA SSO过程
回想一下每次登入BBS时,需要做哪些步骤:
在浏览器中输入bbs.oa.com
浏览器跳转到[http://passport.oa.com/modules/passport/signin.ashx?url=http%3a%2f%2fbbs.oa.com](http://passport.oa.com/modules/passport/signin.ashx?url=http%3a%2f%2fbbs.oa.com)
输入rtx+ping码+token码
Ok,成功登入
在这个过程中,BBS大概做了这些事情,
首先检测GET请求中,是否有参数ticket,发现没有ticket。
所以,BBS将你的请求重定向到passport.oa.com,并且,按照OA SSO的要求,添加url参数,作为oa验证成功后的跳转地址。
OA会首先检测你的cookies中是否有ticket,如果有,是否过期。
如果没有ticket,或者过期。OA会要求输入rtx+ping码+token码,帮你生成一个ticket,由于tocken码由token卡生成,ping码只有你自己知道,所以这个ticket可以作为你的临时凭证
OA生成ticket后,并将这个ticket以cookies的形式存放在浏览器中。这个ticket有时间限制,过期无效(具体多长时间,可以问问OA接口人)。然后,将页面调转到刚才url中对应的地址,并且添加一个GET参数ticket。如下图:
假如,你现在想登入km,在浏览器中输入km.woa.com。这时,km会将你重定向到OA,由于你刚刚生成了ticket并放在OA对应的cookies中,所以OA会直接将你重定向到km首页,并且将ticket作为GET参数附在后面,这样就完成了SSO。
整个过程可以用下面的流程图表示:
OA退出过程
前面的登入是由http://passport.oa.com/modules/passport/signin.ashx这个接口完成,退出则由http://passport.oa.com/modules/passport/signout.ashx完成,原理与上面正好相反,OA会将cookies中的ticket清理掉,这样下次通过OA SSO时,你就必须再一次的输入rtx+ping+token为自己生成临时ticket。
Ticket过长,怎么办?
有时候ticket过长,导致url后面的参数超出了范围而被截断,此时的处理办法是通过session将url参数hold住,无论ticket有多长,都没有关系,因为ticket是在重定向后才带入的,所以在第一此request时,有时间hold住url参数,当重定向回来后,从session中去除数据,就可以避免url参数过长被截断的问题。