单点登陆(SSO)是什么
文章目录
引语
当你清空了浏览器的cookie后,一定遇到过下面的这种糟糕经历:
使用A网站时需要重新登陆,使用B网站是还是需要重新登陆,使用C网站时…,如果你没有使用密码管理工具,还需要考验你的记忆力,万一输错了几次,就会丧心病狂的让你回答一些安全问题(小学的名称?宠物的名称??)遇到这种不支持单点登陆的网站,你不得不问候一下网站管理者。那么当我们在说单点登陆
的时候,说的是什么呢?
单点登陆
单点登录(Single Sign-On,SSO)是一种解决方案,可以让用户在多个应用系统中只需登录一次,就可以访问所有相互信任的应用系统。
下图是描述了单点登陆系统的校验流程,阐述它是怎么运作的。
- 步骤
1
,用户浏览Gmail站点时,Gmail发现用户没有登陆,就会重定向到Google的SSO认证服务,如果SSO认证服务发现用户还没登陆,那么就会再次重定向到SSO的登陆页面,在此页面用户可以完成登陆校验 - 步骤
2-3
,SSO认证服务校验用户合法性,并为该用户创建全局session和token. - 步骤
4-7
,Gmail的服务请求SSO认证服务来校验token的合法性,一旦是合法的token,用户就可以请求访问相应的资源 - 步骤
8
, 用户访问其他Google提供的站点服务,比如YouTube - 步骤
9-10
,YouTube 发现用户还未登陆,就会请求SSO认证服务,SSO认证服务发现用户已经登陆了,就会返回对应的token给YouTube - 步骤
11-14
,YouTube通过SSO认证服务校验TOKEN合法性,一旦是合法的TOKEN,用户就可以请求访问相应的YouTube资源
不同站点是如何共享Token的呢?
答案就是Cookie:
- 应用系统检查当前请求有没有token,如果没有,说明用户在当前系统中尚未登录,那么就将页面跳转至认证中心。
- 如果认证中心发现用户尚未登录,则返回登录页面,等待用户登录,登陆成功时将token 写入 Cookie 中。
- 如果发现用户已经登录过了,就不会让用户再次登录了,而是会跳转回目标 URL,并在跳转前生成一个 token,拼接在目标 URL 的后面,回传给目标应用系统。
对于手机应用如何实现SSO呢?
一种常见的实现方式是,使用 OAuth2 协议来实现单点登录。OAuth2 是一种授权协议,它允许用户授权第三方应用访问他们的资源,而无需将用户名和密码提供给第三方应用。在 OAuth2 中,用户在认证中心进行登录,登录成功后,认证中心会颁发一个访问令牌(Access Token),应用系统可以使用这个访问令牌来访问用户的资源。如果用户在其他应用系统中已经登录过了,那么认证中心会直接颁发访问令牌,无需再次登录。
OAuth2授权流程
sequenceDiagram participant 用户 participant 客户端 participant 认证server autonumber 用户->客户端: 从客户端获取资源 客户端->认证server: 使用用户认证信息获取token 认证server->客户端: 跳转到登陆页面 用户->认证server: 登陆和认证用户合法性 认证server->客户端: 带上authorization code跳转会客户端 客户端->认证server: 通过authorization code获取access token 认证server->客户端: 返回 access token 金额 refresh token 客户端->应用服务端: 通过access token请求保护资源 应用服务端->客户端: 返回保护资源
文章部分内容参考自bytebytego的SystemDesign,仅用于个人学习记录。
文章作者 bobo
上次更新 2023-12-19