基于flask,以及通过session识别用户
该方案通过跳转sso服务器地址来记录同一个用户的信息,通过设置一个用户sid(session),并将其绑定到子系统web-1生成的token,当用户通过该token进行请求时,就能对应上用户信息。
时序图:
原理步骤:
第一次访问:
- 用户首先访问
web-1子系统,系统检查用户的cookie中是否已经有一个token,没有就另外生成一个(随意设置,或者通过随机算法生成)。 - 将
token设置到cookie,发起GET请求到SSO服务器,请求参数包含token,web-1识别标志(可选),next_url(请求完后跳转到某一个地址)。 SSO服务器验证请求的可靠性,生成用户sid,将其保存到session(cookie)中,以此对应一个用户的登录信息。将用户的token与sid绑定到一起,保存到数据库,以后可以通过该token查询sid对应的信息。SSO设置重定向到next_url。- 重定向到
web-1子系统,web-1从cookie获取用户token,并以此发起请求用户信息到SSO,SSO通过token查询sid,获取用户信息(现在为空),返回给web-1,web-1进行用户信息处理,返回界面。 - 用户请求
web-1登录界面,提交登录信息。web-1向SSO发起登录请求,参数为用户登录信息,用户token,SSO验证登录信息,登录成功后将用户信息保存到token对应的sid对应的数据结构中,返回用户信息。 web-1对用户信息进行处理,返回界面。
至此用户信息创建,并保存到SSO服务器中,子系统web-1通过用户token就能获取到对应的sid,以此就能获取对应的用户信息。
而web-2子系统,通过步骤1生成一个token-2,设置到cookie,并重定向到SSO中,现在SSO通过session或者cookie发现该用户已经通过其他子系统生成了sid,然后将该用户在web-2子系统生成的用户token-2与sid绑定到一起,这样web-2子系统也能通过用户token-2来获取同一个用户sid对应的信息了。
python依赖:flask,PyJWT(用于生成token)
nginx:本地hosts设置3个虚拟域名,example-1.com,example-2.com,example-sso.com,通过nginx转发。

