sso中登陆之后拿到的token会存放在cookie中,那么下次登陆其他子应用时候是怎么把sso-token传递过去的呢?
是因为cookie中的domain的一级域名相同,然后登陆时候自动代入传递给应用B服务器,之后拿去sso服务器中校验,然后直接访问B。
还是子应用B也给一个重定向然后浏览器再访问sso链接,此时才代入之前的sso-token。SSO登陆完成后再通过重定向redirect给应用B链接,并且通过查询参数代入sso-token给子应用B拿去到SSO服务器中校验。然后访问B。
这里的区别在于,应用B是如何拿到SSO-token的,是开始访问的时候直接通过cookie带出来给B。还是x通过重定向到SSO链接(访问sso服务器),然后借助sso服务器返回的redirect链接?token=SSO-token交给应用B。后者方法多了一步请求SSO服务器和sso返回重定向链接。
问题1:如果是同域名的话,例如user.bi.test.sankuai.com或者lyb.test.sankuai.com这种内部应用的跨域,那么可以通过设置cookie的domain值为一级域名来实现第一种方法,这样访问应用B的时候就可以自动代入sso-token,避免了二次访问sso服务器。
问题2: 如果是不同域名的话,例如taobao.com和tmall.com也是一个sso,显然,通过设置cookie的domain是行不通的,这个时候这么解决这个问题呢?
所以不同域名的sso,在登录网站B的时候,网站B认证不成功重定向到sso服务器,这个时候浏览器会自动带上sso的cookie,给sso服务器认证。sso认证完之后返回一个认证成功的令牌。然后浏览器拿着sso认证返回的令牌再重定向请求服务器B,服务器拿到这个令牌再去和sso服务器认证,认证成功后,生成cookie-B。
所以这里的关键在于
1.登录第二个网址的时候会重定向到sso(第一次重定向到sso)
2.重定向后会带上sso的cookie,换取sso的token令牌
3.然后回过头来重定向到网址B,带上令牌(第二次重定向到网址B,网址B拿令牌去sso交互,成功后最后返回cookie-B)
4.服务器B拿令牌和sso服务器验证完成后,才会生成cookie-B
所以一般来说,我们讲的sso单点登录可以划分为:同域名和不同域名下的单点登录。
登录鉴权的方式:
1.cookie/session
cookie保存在客户端,session保存在服务端,跨平台困难;
2.JWT
防止CSRF(跨站请求伪造,带上cookie)
适合移动端的应用(App)
无状态,传输数据可以编码增加传输数据的安全性
3.Oauth
优点:开放(任何软件开发商等都可以使用,如微信、QQ登录等);安全(不涉及密钥等敏感信息,比如:扫码,跳转等方式);简单(集成方便,restfulApi,文档齐全);
缺点:需要增加授权服务器,增加网络请求(鉴权过程有回调的存在)