##一个简单的 SSO 单点登陆 单设备登陆 解决方案 SSO英文全称Single Sign On,单点登陆。SSO是在多个应用系统中,用户只须要登陆一次就能够访问全部相互信任的应用系统。它包括能够将此次主要的登陆映射到其余应用中用于同一个用户的登陆的机制。它是目前比较流行的企业业务整合的解决方案之一。前端
实现SSO的技术主要有: (1)基于cookies实现; (2) Broker-based(基于经纪人),例如Kerberos等; (3) Agent-based(基于代理人)在这种解决方案中例如SSH等; (4) Token-based,例如SecurID,WebID,如今被普遍使用的口令认证; (5) 基于网关Agent and Broker-based; (6) 基于安全断言标记语言(SAML)实现; ####可是本文今天不会用到以上方法,可是咱们使用方法相似于Token; 写本次文章的起初是为了解决连接捕获访问服务器的问题,可是单凭单点登陆和单设备登陆是解决不了这个问题的,要配合上(加密,MD5校验,请求惟一性验证,单点登陆,单设备登陆)来组成一个比较完善的安全验证机制.(后面文章会一一说道) 下面开始说正题,对于API来讲通常须要单点登陆的系统都须要进行登陆的操做,那登陆操做咱们会作下面几件事情.sql
1.获取用户名密码进行登陆验证用户是否有效做判断. 2.拿着返回的ID给前端让他能够进行进一步操做.数据库
固然能够直接用ID 直接实现单点登陆 可是没法实现单设备登陆并且直接暴露安全性担心
基本登陆接口作的操做就是以上两种,那么关键点来了,我在思考分析的时候在想若是每次调用登陆获取的ID都是一个临时ID. 当下次登陆的时候失效是否是就能够达到单设备登陆的效果了,这个临时ID对应着真正的用户ID每次客户端请求都是拿着临时ID请求过来而后咱们作验证,不就好了嘛.并且这个临时ID是后端共享的只有一个登陆接口或获取临时ID其余全部模块都能使用来达到单点登陆. 这样就解决了单设备登陆和单点登陆的问题.后端
###固然如何实现是最后一个问题 既然是临时ID并且每一个接口都会去读取验证,那固然不能用数据库,最好我选择了用NOsql中的Redis来做为临时ID的临时存储安全
###登陆接口须要作的事情以下: 1.第一步从Redis中用Id取临时ID 检测有没有 2.生成Cipher(临时密码也就是临时ID) 3.根据第一步检测作不一样的处理 若是存在删除原有的 Cipher关联ID 的key-value 4.建立两个key-value 一个是id对应Cipher 一个是Cipher对于Id服务器
###验证验证须要作的事情 1.经过客户端请求的Cipher获取Redis的value值 2.value若是不存在返回错误 登陆已经失效 3.value存在返回value做为ID 进行操做cookie
经过以上方法就解决的 标题所述的 单点登陆 单设备登陆的问题 :fa-glass:加密