单点登录 SSO

单点登录全称Single Sign On(简称SSO),是指在多系统中用户只需要登录一个系统,便可在其他所有系统中得到授权而无需再次登录。

传统方法

对于小型站点来说,可以直接通过cookiesession在多个页面下实现登录状态的共享。

session常被保存在redis/memcached集群中,以便提高访问效率。

使用cookie和session有哪些问题?
cookie不安全,需要通过加密算法来处理,而且cookie不能跨域。

单点登录

主要思想是设计一个独立于各个系统的登录系统,也即是说要把用户登录的权限验证统一管理

基本原理

单点登录SSO需要一个独立的认证中心,具有以下特性:

  • 认证中心负责接收用户登录和权限申请,包括用户密码等安全信息;
  • 认证中心负责给用户生成、给业务系统验证授权令牌
  • 业务系统通过认证中心下发的授权令牌间接授权。

认证流程

认证流程大体可以分为:

  • 业务系统检查当前用户是否已经拥有授权令牌
  • 如果不存在的话,跳转统一登录页面
    • 用户密码登录
    • 下发授权令牌(此时,用户已经拥有授权令牌
    • 重定向回业务系统
  • 业务系统检查通过认证中心校验授权令牌的有效性
  • 完成登录

认证过程

注销流程

由于单点登录的状态是统一管理的,那么用户在任何一个系统中注销登录状态的同时需要保证其他系统的授权令牌同时失效。

注销流程相对比较简单:

  • 用户发起注销操作
  • 业务系统通知认证中心当前授权令牌注销
  • 认证中心注销当前授权令牌,并通知其他业务系统当前授权令牌的销毁
  • 用户注销完成

系统特点

  • SSO登录状态的全局性(与业务系统无关)
  • 授权令牌状态同步的实时性(注销需要实时下发到各个业务系统)

常见问题

大量授权请求如何处理?

  1. 大量并发请求可以通过使用分布式缓存方案来解决

由于登录状态是可以容忍状态的丢失的(不一定需要落盘),从而可以通过把授权信息存储的缓存系统(redis、memcached)中,从而实现良好的系统性能,

  1. 预生成授权令牌来解决授权令牌加密生成造成CPU负担的问题

常见的授权令牌都需要加密处理,大量的授权请求必然影响系统性能,可通过预生成授权令牌的方式来降低批量生成令牌造成的资源竞争。

全局和局部的授权令牌如何同步处理?

由于登录状态的一致性对时延要求不高,所以一般采用异步通知的方式,可采用消息队列来通知各个业务系统。

此外,为了避免消息处理中发生的异常情况,授权令牌的时效性也需要一定的限制。

应用

常见的单点登录包括一些网站或应用的微信认证登录、QQ认证登录、微博认证登录以及淘宝、360、微博、网易、美团的登录认证方式。

其他类似系统

全局唯一ID生成器(不仅仅是UUID),可参考微信消息的唯一ID的生成方式