1.什么是单点登录(SSO),是比较流行的企业业务集成解决方案之一?SSO的定义是在多个应用系统中,用户只需要一次登录,就可以访问所有相互信任的应用系统。SSO一般需要一个独立的认证中心(护照)。子系统的登录必须通过护照,子系统本身不会参与登录操作。当一个系统登录成功后,通行证会发给各个子系统一个token,子系统可以使用token获取自己受保护的资源。为了减少频繁的认证,每个子系统在通过护照授权后会建立本地会话,在一定时间内可以使用。无需再次对护照发起认证。上图中有四个系统,分别是Application1、Application2、Application3、SSO。当Application1、Application2、Application3需要登录时,会跳转到SSO系统。SSO系统完成登录后,其他应用系统也会登录,登录即可。比如淘宝、天猫属于阿里的。当用户登录淘宝再打开天猫时,系统会自动为用户登录天猫。这种现象属于单点登录2.如何实现同域名下的单点登录cookie的domin属性设置为当前域的父域,父域的cookie会被共享由子域。path属性默认为Web应用程序的上下文路径。利用cookie的这个特性,是的,我们只需要将cookie的domain属性设置为父域的域名(主域名),将cookie的path属性设置为根路径即可。ID(或令牌)保存到父域。这样所有的子域应用都可以访问到这个cookie,但是这就要求应用系统的域名必须建立在一个共同的主域名下,比如tieba.baidu.com和map.baidu.com,这都建立在百度上。com下的主域名,那么他们就可以通过这种方式实现单点登录。不同域名下的单点登录(1)如果是在不同域的情况下,cookies是不共享的,这里我们可以部署一个认证中心,一个独立的Web服务用户,用于处理登录请求登录到认证中心。登录成功后,认证中心记录用户的登录状态,并将token写入cookie中(注意这个cookie是属于认证中心的,应用系统是访问不到的)应用系统检查是否有Token在当前请求中。如果没有,说明用户没有在当前系统登录,那么页面会被重定向到认证中心。由于这个操作会自动带上认证中心的cookie,所以,认证中心可以根据cookie知道用户是否登录过。如果认证中心发现用户未登录,则返回登录页面等待用户登录,如果发现用户已经登录,则不允许用户再次登录,但会跳转到目标URL,并在跳转前生成一个Token,拼接在目标URL后面,回传给目标应用系统。应用系统拿到Token后,需要向认证中心确认Token的有效性,以防止用户伪造。确认无误后,应用系统记录用户的登录状态,将Token写入cookie中,然后允许本次访问。(注意这个cookie是属于当前应用系统的。)当用户再次访问当前应用系统时,会自动带上Token。应用系统验证Token,发现用户已经登录,所以不会有认证中心。这种实现方式比较复杂,支持跨域,扩展性好。这是单点登录的标准做法。不同域名下的单点登录(2)可以选择将SessionID(或Token)保存在浏览器的LocalStorage中,这样前端每次登录时向后端发送请求时,主动通过LocalStorage数据到服务器。这些都由前端控制。后台只需要在用户登录成功后,将SessionID(或Token)放入响应体即可。传递给前端单点登录完全可以在前端实现。前端拿到SessionID(或Token)后,除了写入自己的LocalStorage外,还可以通过特殊方式写入其他多个域下的LocalStorage。关键代码如下://获取tokenvartoken=result.data.token;//动态创建一个不可见的iframe,并在iframe中加载一个跨域的HTMLvariframe=document.createElement("iframe");iframe.src="http://app1.com/localstorage.html";document.body.append(iframe);//使用postMessage()方法将token传给iframesetTimeout(function(){iframe.contentWindow.postMessage(token,"http://app1.com");},4000);setTimeout(函数(){iframe.remove();},6000);//给这个iframe加载的HTML绑定一个事件监听器,当事件触发时,写入接收到的token数据)},错误的);前端通过iframe+postMessage()向多个域写入同一个Token在下面的LocalStorage中,前端每次都会主动从LocalStorage中读取Token并携带在请求中,然后再向后端发送请求,让同一个Token被多个域共享。这种实现方式完全由前端控制,几乎不需要后端参与,也支持跨域。3.流程单点登录流程图如下:用户访问系统1的受保护资源,系统1发现用户未登录,跳转到sso认证中心,并使用自己的地址作为一个参数。sso认证中心发现用户未登录,引导用户进入登录页面。用户输入用户名和密码提交登录申请。sso认证中心对用户信息进行校验,建立用户与sso认证中心的关系。它们之间的会话称为全局会话。同时,创建授权令牌。sso认证中心拿着token,跳转到原来的请求地址(系统1)。System1拿到token,去sso认证中心验证token是否有效。sso认证中心检查令牌并返回有效。注册系统1使用令牌与用户建立会话,称为本地会话,并返回受保护的资源。用户访问系统受保护的资源2、去sso认证中心,使用自己的地址作为参数。sso认证中心发现用户已经登录,跳回系统2的地址,附加token。系统2拿到token去sso认证中心验证token是否Validsso认证中心验证token,返回valid,注册系统2system2使用这个token与用户建立本地session,返回受保护资源后用户成功登录后,会与sso认证中心及各个子系统建立会话,用户与sso认证中心建立的会话称为全局会话。用户与各个子系统之间建立的会话称为本地会话。本地会话建立后,用户对子系统受保护资源的访问将不再通过sso认证中心。全局会话和本地会话如下约束关系:本地会话存在,全局会话必须存在全局会话存在,本地会话不一定存在全局会话销毁,本地会话必须销毁参考https://blog.csdn.net/weixin_...https://baike.baidu.com/item/...https://juejin.cn/post/684490...往届面试官:谈谈对这个对象的理解面试官:JavaScript中的执行上下文和执行栈是什么?面试官:说说JavaScript中的事件模型面试官:typeof和instanceof的区别面试官:解释什么是事件代理?应用场景?面试官:说说新运营商具体是做什么的?面试官:ajax的原理是什么?如何实现?面试官:bind、call、apply有什么区别?如何实现绑定?面试官:说说你对正则表达式的理解?应用场景?面试官:说说你对事件循环的理解去github面试题库看更多