一种比较简单的web端SSO方案
2017-02-25 18:50
375 查看
这是种比较简单易行单点登录(SSO Single sign-on方案,只有
http://localhost:9080 是用户要登录的应用
https://localhost:8443 是认证中心,提供sso认证的服务端
交互过程描述,可以想象成在一个论坛上进行QQ登录
浏览器访问
如果此时
成功登录单点登录服务之后,接着单点登录服务端回调客户端的回传地址:
客户端会把 ticket 提交给服务器来验证 ticket 是否有效(这一步是服务端之间的交互),如果有效服务器端将返回用户身份(客户端就拿到了当前用户的信息,可以是个类似id的东西)
客户端可以再根据这个
ticket的算法比较多的是使用
还有些问题需要解决,例如怎么退出,怎么记录不同的客户端。。根据实际情况在进行设计,参考这篇单点登录是怎么回事
下面是一张交互图
![](/content/images/2016/10/sso_interaction.png)
用户在每个客户端的登录状态是独立,SSO服务只提供用户认证,不提供用户权限等信息。
如果是要做平台,请参考 OAuth2.0协议,很多主流平台都用这个协议来做API或者是第三方认证平台,可以看看微博或者QQ登录的接入API。还有其它的开源解决方案,暂时没怎么研究过。
限制ticket的有效期
客户端拿着ticket去换取用户信息的时候,加入签名等
https://pypi.python.org/pypi/django-simple-sso 这是个django的sso实现,它这里还添加了
auth token,没有
request token,自己家的系统集成提供一点思路。文章的阅读对象需要比较熟悉web开发,因为省去了很多前置知识。
认证流程
单点登录的几个角色,单点登录服务(center), 接入的应用叫做
客户端(client)。 当然描述的时候会涉及
浏览器(browser),还有
用户
http://localhost:9080 是用户要登录的应用
https://localhost:8443 是认证中心,提供sso认证的服务端
交互过程描述,可以想象成在一个论坛上进行QQ登录
浏览器访问
客户端需要登录的页面
http://localhost:9080/client/,此时会跳到单点登录服务器的地址
https://localhost:8443/server/login?service=http://localhost:9080/client/cas(对于用户
浏览器是一次302重定向)
如果此时
用户在
单点登录服务也没有登录的话,会显示登录表单页面,输入
用户名 / 密码进行登录;
成功登录单点登录服务之后,接着单点登录服务端回调客户端的回传地址:
http://localhost:9080/client/cas?ticket=ST-1-eh2cIo92F9syvoMs5DOg-cas01.example.org(对于用户来说,浏览器进行了一次302重定向), 且带着一个 ticket(也可以叫做
auth token);
客户端会把 ticket 提交给服务器来验证 ticket 是否有效(这一步是服务端之间的交互),如果有效服务器端将返回用户身份(客户端就拿到了当前用户的信息,可以是个类似id的东西)
客户端可以再根据这个
用户身份获取如当前系统用户 / 角色 / 权限信息, 从而完成整个登录过程
ticket的算法比较多的是使用
md5或者sha-1q签名,客户端和单点登录服务端都有一个key,通过对某些信息做签名,验证数据的合法行。OpenResty - 基于MD5的参数签名认证 有提到过。
还有些问题需要解决,例如怎么退出,怎么记录不同的客户端。。根据实际情况在进行设计,参考这篇单点登录是怎么回事
下面是一张交互图
![](/content/images/2016/10/sso_interaction.png)
用户在每个客户端的登录状态是独立,SSO服务只提供用户认证,不提供用户权限等信息。
如果是要做平台,请参考 OAuth2.0协议,很多主流平台都用这个协议来做API或者是第三方认证平台,可以看看微博或者QQ登录的接入API。还有其它的开源解决方案,暂时没怎么研究过。
安全
一定要记得启用https限制ticket的有效期
客户端拿着ticket去换取用户信息的时候,加入签名等
参考
https://yq.aliyun.com/articles/42566 说的比较详细,通俗易懂一些,说了很多这里没有说明的问题。https://pypi.python.org/pypi/django-simple-sso 这是个django的sso实现,它这里还添加了
request token,也就是在第一步客户端验证需要登录的时候,先要获取一个 request token(服务器之间的交互), 然后拿着这个token,在换
auth token,后面基本相同了。
相关文章推荐
- 一种简单,轻量,灵活的C#对象转Json对象的方案
- 一种比较简单的递归创建目录的方法
- 一种简单方便的权限控制方案
- 一种比较简单的绘制半透明多边形的方法
- 解决ScrollView嵌套RecyclerView只显示一行的一种比较简单的方法
- 一种简单有效的3D模型的动画多线程方案
- 一种简单的无限深度树结构数据库设计方案
- 基于Asp.NET MemberShip的简单SSO方案
- [导入]在特定情况下的简单SSO实现方案
- 一种简单的自校验的注册码生成方案以及暗桩方法
- asp.net 服务器端Label控件字间距调整的一种简单方案
- 【Android N7.0】Framework层实现派发HOME按键到Application层的一种简单方案
- 介绍一种简单的单点登录方案
- 一种简单,轻量,灵活的C#对象转Json对象的方案(续)
- 一种比较简单的在USB U盘中访问nandflash的方法
- 一种夜间模式简单实现方案
- 一种比较简单快速的硬盘全新安装Win10单双系统的方法
- 在特定情况下的简单SSO实现方案
- 【未完】[MySQL集群架构] 多主一从的一种简单方案
- 一种简单的移动端屏幕适配方案