前语

最近公司事务在拓展,如移动端需求运用公司的用户体系和公司内部的产品线需集成各运用子体系,考虑到身份验证、用户信息授权可扩展性、可复用性等问题,避免用户需求针对每个运用体系都进行独立的登录,咱们研发团队对单点登录计划的评论进入了议程。

什么是单点登录

单点登录(Single Sign-On, SSO)是一种身份验证机制,允许用户一次登录即可拜访多个运用程序或体系,无需为每个运用程序或体系别离输入认证凭证,便可在其他一切体系中得到授权,无需再次登录。

单点登录处理什么问题

用户侧

  • 用户只需求一次身份验证即可拜访多个运用程序或体系,然后简化了登录过程,提高了用户体验。
  • 减少了用户忘记暗码或用户名的风险,由于只需求记住一个凭证。
  • 提高安全性,由于用户无需在每个运用程序或体系中输入暗码,然后减少了暗码走漏或人为过错的可能性。

公司侧

  • 减少了运用程序或体系中身份验证模块的开发和维护作业,由于这些模块能够集成到单个身份供给者中(如一致认证中心)。
  • 简化了用户管理和授权,使开发者能够运用单一的用户体系中心来管理和授权用户对多个运用程序或体系的拜访。
  • 降低了开发本钱和时刻,由于开发者无需为每个运用程序或体系编写自己的身份验证逻辑,而是能够重用已有的用户体系。

单点登录的原理和完成计划

基本原理

  1. 用户登录:用户在任何一个运用程序或体系中进行身份验证,并供给他们的凭证。
  2. 认证体系验证:该凭证被发送到认证体系进行验证。假如凭证有用,则认证体系会为用户生成数字签名的令牌(如token或ticket)。
  3. 令牌分发:认证体系将令牌回来给运用程序或子体系。
  4. 运用程序或体系授权:运用程序或体系运用令牌验证用户的身份,并授权其拜访相应资源或服务。
  5. 跨域体系拜访:用户能够经过同一令牌拜访多个跨域运用程序或体系,而无需重复进行身份验证。

完成计划

单点登录的完成计划一般包括:Cookies、分布式Session方法、一致认证授权方法(JWT、OAuth2.0)等。现在处理跨域问题的比较常用的计划是分布式Session及一致认证授权方法。

Cookie单点登录

根据Cookie的单点登录是最简略的单点登录完成方法,运用一个同享的Cookie作为用户身份验证凭证,并在多个运用程序或体系之间进行同享。当用户首次登录某个运用程序时,该运用程序会生成一个加密Cookie,并将其发送到用户的浏览器中(后端接口回来响应头设置cookie)。随后,当用户测验拜访其他运用程序时,这些运用程序恳求头会自动带上cookie,后端运用其间的信息验证用户身份。这种方法虽然完成简略,但在Android和iOS运用程序中通常不直接运用cookie来处理数据(我猜测是由于不同的设备和操作体系可能对cookie的支持程度不同),由于cookie是一种在web浏览器中运用的机制,它的运用场景在浏览器端。一起它不支持跨域拜访,假如需求在各运用网站同享cookie,其对应的多个站点的尖端域名有必要相同

单点登录实现思路和方案

分布式Session完成单点登录

其实这种方法的原理和cookie差不多,分布式Session完成单点登录原理是将用户认证信息保存于Session中,即以Session内存储的值为用户凭证,一般采用Cache中间件完成(如Redis)。用户再次登录时,运用服务端获取分布式Session来校验用户信息。如图所示:

graph LR;
    A[用户验证信息Session];
    A-->B[运用体系1];
    A-->C[运用体系2];
    A-->D[运用体系3];

一般情况下都是根据Redis完成Session同享,将Session存储于Redis上,然后将整个体系的大局Cookie Domain设置于尖端域名(如example.com)上,这样SessionID就能在各个子体系间同享。这种方法也有一个问题,同享Session无法处理跨尖端域名(如example.cn、example.com、example.net等)。

运用JWT完成单点登录

JWT (JSON Web Token)是一个开放规范,它是一个含签名并带着用户相关信息的加密串。运用JWT进行身份验证时,客户端将用户的登录信息发送给服务器,服务器经过验证后生成一个加密字符串,并将其回来给客户端。客户端在随后的恳求头中带着该加密字符串,服务器接收到恳求后解析加密字符串,验证其间的签名和有用期,然后根据带着的信息判断是否授权拜访。

JWT(JSON Web Token)字符串主要包括以下三部分:

  1. Header(头部):由两部分组成,别离是令牌类型(通常为JWT)和运用的加密算法(例如HMAC SHA256或RSA)。
  2. Payload(载荷):也称为Claims,包括了一些有关用户或实体的信息,例如身份验证状态、权限或其他元数据。Payload能够包括多个声明(Claim),每个声明以键值对的形式呈现,并且包括规范声明和自定义声明。规范声明包括iss(令牌颁布者)、exp(令牌过期时刻)、sub(令牌主题)等。
  3. Signature(签名):由Header、Payload和秘钥生成的签名,用于验证令牌是否合法和未被篡改。签名通常运用Base64编码后的Header和Payload和一个秘钥进行哈希运算生成。

其他网页运用结合JWT与分布式session,完成多域多空间单点登录。经过JWT生成和校验令牌,将刷新令牌存储在redis中,网关一致校验令牌,校验经过后将用户信息设置在恳求头中,运用在阻拦器中获取到用户信息后即可验证经过。

不同域中的网站共用一套密钥并且实时同步用户信息,经过JWT生成和校验令牌,用户登录其间一个域后,前端获取JWT加密串并写入Local Storage中,当用户跳到到其他域的网站时前端传入该加密串,后端网关校验,由此完成免登录拜访其他域资源,如下图所示:

  sequenceDiagram
    浏览器->>网关: 登录
    Note left of 浏览器: 用户登录
    网关->>用户体系:Nginx转发
    Note right of 用户体系: 生成JWT加密串
    用户体系-->>浏览器:回来JWT给浏览器
    Note left of 浏览器: 用户成功登录后,点击拜访跨域子体系
    浏览器->>网关: 前端恳求头传JWT,恳求跨域子体系
    网关->>跨域子体系:网关阻拦到恳求,做JWT校验成功后才可拜访跨域子体系
    跨域子体系-->>浏览器: 成功
    浏览器->>网关: 登录
    Note left of 浏览器: 用户未成功登录或session过期
    Note right of 网关: 网关JWT校验失利,不能拜访跨域子体系
    网关-->>浏览器: 响应失利

运用OAuth2.0完成单点登录

OAuth 2.0 是一种认证授权机制,主要用来颁布令牌(ticket),OAuth的核心就是向第三方运用颁布令牌,OAuth2.0对应下图中的一致认证体系:

单点登录实现思路和方案

如图,经过一致认证授权方法完成单点登录,需求有一个一致的认证体系。用户第一次拜访运用体系时,由于还未登录,被引导到认证体系中进行登录,认证体系承受用户名暗码等安全信息,生成拜访令牌(ticket)。用户经过ticket拜访运用体系,运用体系承受到恳求之后会拜访认证体系查看ticket的合法性,假如查看经过,用户就能够在不用再次登录的情况下拜访运用体系资源。

具体流程如下:

journey
    title  
    section 用户登录
        用户在任何一个运用程序或体系中进行身份验证,并供给他们的凭证:done,des1
    section 认证体系
        将用户的凭证发送到认证中心体系进行验证。假如凭证有用,则身份供给者会为用户生成数字签名的令牌:des2
    section 令牌分发
        认证体系将令牌回来给运用程序或体系。:des3
    section 体系授权
        运用令牌验证用户的身份,并授权其拜访相应资源或服务(如用户信息)。:des3
    section 跨域拜访
        同一令牌跨域拜访,无需重复进行身份验证。:des3

需求注意的是,为了完成这种方法的单点登录,一切触及的子运用或体系都有必要能够与认证中心进行集成,并运用相同的身份验证和授权协议(如OAuth),假如想完成更安全的认证方法,能够运用多因素身份验证(暗码、短信验证码等)。经过OAuth2.0认证完成单点登录,为开发人员供给了一个通用的身份验证框架,提高开发人员的效率,处理了跨尖端域名单点登录问题。

总结

完成单点登录的干流的技能计划很多,并不是说哪种计划最好,技能计划服务于事务,为事务赋能,咱们需求针对具体运用场景来拟定最优处理计划。