一个安全的信息系统,合法身份检查是必须环节。尤为IM这种以“人”为中心的社交体系,身份认证更是必不可少。php
一些PC时代小型IM系统中,身份认证可能直接作到长链接中(也就是整个IM系统都是以长链接为中心:身份鉴权、数据收发、文件传送等等)。但当前主流的IM(尤为新一代的移动端IM)中,都是“长”(指TCP或UDP长链接)、“短”(是指Http短链接)相结合的方式。html
一个现代的移动端IM“长”、“短”链接配合内容大体以下:算法
1)短链接用途1:前置HTTP的SSO单点接口来实现身份认证;安全
2)短链接用途2:集群式的IM中可能还会有独立(或集成于SSO单独登录接口中)的SLB接口(即基于HTTP短链接拉取IM服务器集群IP列表);服务器
3)短链接用途3:各类小文件的上传、下载接口实现(头像、图片、语音、文件等)都会是基于Http实现;微信
4)长链接用途1:用户的实时上、下线状态通知;网络
5)长链接用途2:实时的加友、加群等指令收发;架构
6)长链接用途3:服务端发起的其它实时指令推送等。负载均衡
总之:当今主流的移动IM系统中,“长”、“短”链接分工明确,各自将自身的优点发挥到最大化,优势是:系统分工明确、分层清晰、业务划分合理、负载方案成本低、符合移动网络的特性等。分布式
针对上述主流移动IM系统中“长”、“短”链接的分工方式,其中最为重要也是用户最早接触到的——就是基于Http的SSO单点登录接口(有的系统里可能并不叫SSO接口,本文讨论的是其广义:即实现身份认证功能的http接口),那么这个SSO接口工做原理是什么?能够怎么来实现?有无最佳实践建议?
OK,带着上述的这几个疑问,让咱们开启本文的正文部分。
正文内容说明:正文部分介绍SSO单点登录接口时,是以通用信息系统的角度来阐述原理、逻辑、最佳实践,而非专门针对IM系统,但道理是如出一辙的,理解原理后彻底能够设计出适合您IM系统的SSO接口。(话外音:实际上是懒的从新打字和画图 ^_^)。
学习交流:
- 即时通信开发交流群:320837163 [推荐]
- 移动端IM开发入门文章:《新手入门一篇就够:从零开发移动端IM》
(本文同步发布于:http://www.52im.net/thread-1351-1-1.html)
▼ 带着本文对SSO单点登录(或者说身份认证)接口的知识,您将能更好的读懂下述技术文章:
总之,以上几篇精选的文章能够跟本文的知识相辅相成,共同完善您的IM技术开发知识体系,但愿对你有用。
▼ IM开发干货系列文章也适合做为IM开发的系统性入门资料(本文是其第10篇):
《IM消息送达保证机制实现(一):保证在线实时消息的可靠投递》
若是您正在查阅更多移动端IM开发资料,强烈推荐阅读《新手入门一篇就够:从零开发移动端IM》。
杨丽:拥有多年互联网应用系统研发经验,曾就任于古大集团,现任职中青易游的系统架构师,主要负责公司研发中心业务系统的架构设计以及新技术积累和培训。现阶段主要关注开源软件、软件架构、微服务以及大数据。
张辉清:10 多年的 IT 老兵,前后担任携程架构师、古大集团首席架构、中青易游 CTO 等职务,主导过两家公司的技术架构升级改造工做。现关注架构与工程效率,技术与业务的匹配与融合,技术价值与创新。
假设一个场景:公司内部有财务、OA、订单服务等各种相互独立的应用系统,员工张三对这些系统有操做权限,若是张三想要登陆某个系统进行业务操做,那么他须要输入相应的帐号与密码。
想象一下:当公司内部有 100 个应用系统,张三是否是要输入 100 次用户名和密码进行登陆,而后分别才能进行业务操做呢?显然这是很很差的体验。
所以咱们须要引入一个这样的机制:张三只要输入一次用户名和密码登陆,成功登陆后,他就能够访问财务系统、OA 系统、订单服务等系统——这就是单点登陆。
单点登陆的英文全称是 Single Sign On,简称是 SSO:
它的意思是说用户只须要登陆一次,就能够在我的权限范围内,访问全部相互信任应用的功能模块,无论整个应用群的内部有多么复杂,对用户而言,都是一个统一的总体。用户访问 Web 系统的整个应用群与访问单个系统同样,登陆和注销分别只要一次就够了。
举个简单的例子,你登陆了百度网页以后,点击跳转到百度贴吧,这时能够发现你已经自动登陆了百度贴吧——这就是单独登录的原理。
针对本文上半部分的原理介绍,咱们以一个真实的信息系统为例,理论联系实际来说解具体的SSO单点登录技术实现(实际上,用IM系统的设计思路来看这个例子,可能有点复杂,但知识是相通的,它更有助于对SSO完整知识体系的理解。)
SSO 的技术实现要想作好并不容易,做者认为需求优先级应该先是单点登陆和单点注销功能,而后是应用接入的门槛,最后是数据安全性,安全性对于 SSO 也很是重要。SSO 的核心是认证中心,但要实现用户一次登陆,处处访问的效果,技术实现须要创建在用户系统、认证中心、权限系统、企业门户的基础上。
各职责以下:
用户系统:负责用户名、密码等账户信息管理,包括增长、修改、启用、停用用户账号,同时为认证中心提供对用户名和密码的校验;
认证中心:负责凭证 token 的生成、加密、颁发、验证、销毁、登入 Login、登出 Logout。用户只有拥有凭证并验证经过才能访问企业门户;
权限系统:负责角色管理、资源设置、受权设置、鉴定权限,具体实现可参考 RBAC。权限系统可为企业门户提供用户权限范围内的导航;
企业门户:做为应用系统的集成门户 (Portal),集成了多个应用系统的功能,为用户提供连接导航、用户信息和登出功能等。
主要包含如下内容:
登陆认证:接收登陆账号信息,让用户系统验证用户的登陆信息;
凭证生成:建立受权凭证 token,生成的凭证通常包含用户账号信息、过时时间等信息,它是一串加密的字符串,加密算法如 AES{凭证实文 +MD5 加信息},可采用 JWT 标准;
凭证颁发:与 SSO 客户端通讯,发送凭证给 SSO 客户端;
凭证验证:接收并校验来自 SSO 客户端的凭证有效性,凭证验证包括算法验证和数据验证;
凭证销毁与登出:接收来自 SSO 客户端的登出请求,记录并销毁凭证,跳转至登陆页面。
客户端的实现逻辑大体以下:
1)请求拦截:拦截应用未登陆请求,跳转至登陆页面;
2)获取凭证:接收并存储由 SSO 服务端发来的凭证,凭证存储的方式有 Cookie、Session、网址传参、Header 等;
3)提交凭证验证:与 SSO 服务端通讯,发出校验凭证有效性的请求;
4)获取用户权限:获取该凭证的用户权限,并返回受保护资源给用户;
5)凭证销毁与登出:销毁本地会话,而后跳转至登出页面。
用户的单点登陆流程以下:
1)登陆:将用户输入的用户名和密码发送至认证中心,而后认证中心调用用户系统来验证登陆信息;
2)生成并颁发凭证:经过登陆信息的验证后,认证中心建立受权凭证 token,而后把这个受权凭证 token 返回给 SSO 客户端。SSO 客户端拿到这个 token,进行存储。在后续请求中,在 HTTP 请求数据中都得加上这个 token;
3)凭证验证:SSO 客户端发送凭证 token 给认证中心,认证中心校验这个 token 的有效性。凭证验证有算法验证和数据验证,算法验证可在 SSO 客户端完成。
以上是用户的访问流程,若是用户没有有效的凭证,认证中心将强制用户进入登陆流程。对于单点注销,用户若是注销了应用群内的其中一个应用,那么全局 token 也会被销毁,应用群内的全部应用将不能再被访问。
例子中的应用接入与集成具体以下:
1)用户系统:接入国内机票平台的用户系统,负责登陆认证;
2)权限系统:接入国内机票平台的权限系统;
3)认证中心:负责生成并颁发凭证、销毁凭证,改造国内机票平台的登入、登出;
4)凭证验证:在国内机票、国际机票应用系统中调用 SSO 客户端组件实现凭证的验证;
5)企业门户:由国内机票平台、国际机票平台承担。
JSON Web Token (JWT) 是目前应用最为普遍的 token 格式,是为了在网络应用环境间传递声明而执行的一种基于 JSON 的开放标准(RFC 7519)。该 token 设计紧凑且安全,特别适用于分布式站点的单点登陆、API 网关等场景。
JWT 的声明通常被用来在身份提供者和服务提供者间传递被认证的用户身份信息,以便于从资源服务器获取资源,也能够增长一些额外的其它业务逻辑所必须的声明信息。该 token 也可直接被用于认证,也可被加密。JWT 信息体由 3 部分构成:头 Header+ 载荷 Payload+ 签名 Signature。
JWT具体优势以下:
JWT 支持多种语言,C#、Java、JavaScript、Node.js、PHP 等不少语言均可以使用;
JWT 能够自身存储一些和业务逻辑有关的所必要的非敏感信息,由于有了 Payload 部分;
利于传输,由于 JWT 的构成很是简单,字节占用很小;
不须要在服务端保存会话信息,不只省去服务端资源开销,并且使得应用易于扩展。
(本文同步发布于:http://www.52im.net/thread-1351-1-1.html)
[1] 有关IM架构设计:
《一套海量在线用户的移动端IM架构设计实践分享(含详细图文)》
>> 更多同类文章 ……
[2] 有关IM安全的文章:
《即时通信安全篇(一):正确地理解和使用Android端加密算法》
《即时通信安全篇(四):实例分析Android中密钥硬编码的风险》
《即时通信安全篇(五):对称加密技术在Android平台上的应用实践》
《传输层安全协议SSL/TLS的Java平台实现简介和Demo演示》
《理论联系实际:一套典型的IM通讯协议设计详解(含安全层设计)》
《微信新一代通讯安全解决方案:基于TLS1.3的MMTLS详解》
《来自阿里OpenIM:打造安全可靠即时通信服务的技术实践分享》
《Web端即时通信安全:跨站点WebSocket劫持漏洞详解(含示例代码)》
>> 更多同类文章 ……
[3] IM开发综合文章:
《IM消息送达保证机制实现(一):保证在线实时消息的可靠投递》
《开源IM工程“蘑菇街TeamTalk”的现状:一场虎头蛇尾的开源秀》
《QQ音乐团队分享:Android中的图片压缩技术详解(上篇)》
《QQ音乐团队分享:Android中的图片压缩技术详解(下篇)》
《腾讯原创分享(一):如何大幅提高移动网络下手机QQ的图片传输速度和成功率》
《腾讯原创分享(二):如何大幅压缩移动网络下APP的流量消耗(上篇)》
《腾讯原创分享(二):如何大幅压缩移动网络下APP的流量消耗(下篇)》
《如约而至:微信自用的移动端IM网络层跨平台组件库Mars已正式开源》
《基于社交网络的Yelp是如何实现海量用户图片的无损压缩的?》
>> 更多同类文章 ……
(本文同步发布于:http://www.52im.net/thread-1351-1-1.html)