关于什么叫SSO(单点登录),这个概念具体的信息我就不详述了,网上一搜一大把,总的来说,它是一种可以控制各个独立的系统经过它的授权后,

可以用同一个帐号体系登录不同的系统,达到一处登录,多处使用的效果。

最近的项目中就需要用到这个SSO,对我来说,我了解和接触的最早的SSO系统应该是康盛的Ucenter和PHPCMS的phpsso。还记得当时第一次看到它能在不同系统间实现同步

登录、同步退出这功能时,感觉好牛呀。技术人的思维就是想扒开看看,到底怎么做的?无奈当时技术能力有限,由于没怎么看懂,就没深入研究了,只要会用就行了。

当然了,现在再看上去已经没什么神秘的了,但在当时还是很震撼我这个小白的。

SSO其实明白了原理,不管如何变化,它的基本核心是不会变了。我们要实现的就是如何保持登录状态,如何判断你在各个系统有无登录?这个如果在单体应用中,那是再简单不过了

可以存在Cookie中,存在Session中等,那么SSO中应该如何去实现呢?其实,总的思路也是一样的,通过COOKIE在单独的服务器保留登录凭证,各系统之间独立去控制自已系统的状态。

看过淘宝,京东,百度,新浪等实现的SSO,一来看上去有点麻烦,需要在网址间跳来跳去,再者,它好像不太好满足我的项目。这些系统比如登录页一般都是有一个统一的登录页,但是

我这里要求每个登录页地址和风格可以不一样,甚至登录页有弹框和页面两种。这种情况下,其实用这种方式就不太好弄了。

于是,我和同事在考虑了一些方案,然后做了一些小demo后,决定使用前端实现SSO,就是说通过API接口的方式来实现。这种方案有个好处就是前后端是分离的,后端只需要实现

SSO的功能,前端去实现什么时候调用接口就行,没有页面跳转。就能达到不管你登录页怎么变,凡正后端接口和数据一样,至于展示就是前端的事了。

好了,方案定下来了,现在说说怎么实现吧??我这里可能会侧重于服务端一些,因为前端我不太熟悉,前端是由另一个同事实现的。

首先我们在网站A上嵌入一段隐藏的Iframe.

<div style="display:none>
<iframe src="https://dev.sso.com/auth" id="sso" width="0" height="0" frameborder="0" scrolling="0"></iframe>
</div>

dev.sso.com/auth这个页里面是一些与网站和后端通讯的代码。前端主要使用sendmessage在框架内外通讯。这个域名也是SSO单独认证的域名,就是说各个需要接入SSO功能的系统

都是通过这个域名来验证的。

通讯流程如下:

**1)打开网站A,前端通过sendmessage通讯,查看网站A有没有在dev.sso.com这个SSO服务器存在登录凭证(cookie存储)**
**2)如果不存在,直接出登录页面,**
**如果存在,则继续调用dev.sso.com/validate接口,这个接口会验证登录凭证的有效性,有效则表示登录了,同 时返回一个访问token(如果请求接口时,带上了token则验证合法后,**
**返回这个token,如果token不合法,提示要重新登录,并清除单点上的登录凭证。如要没有带上,则生成一个新的),这个token用于后续网站其它接口的访问; 无效渲染出登录页。**
**3)前端将返回的token存在本地,后续的接口都带上这个token就行了**

4) 打开网站B,前端通过sendmessage通讯,发现在SSO服务器上有登录凭证。于是调用dev.sso.com/validate验证后,和第2步一样,返回访问token。服务端需要将这个访问token和用户

token作关联,表示是同一个用户。

5) 网站B通过这个访问token就能访问后续接口了。

至此,整个通讯就完成了,我们发现通过这样的方式,还是蛮简单的,也确实省去了很多步骤。而且一些安全性什么的在接口也可以一并处理了。没有暴露太多信息给前端。只有一个token

当然了,目前这种方案因为前端没有保存登录状态,每次都要实时去验证,这样对服务器是有一些性能消耗的。如果用户太多,那就问题更大了。而且,服务端缓存中存的绑定信息,如果用户太多

估计也会有不小的问题。

目前也只是实现了这样的SSO功能,其实SSO真要做起来也是一个很复杂的东西,除了登录,还有鉴权等,我们用户基数目前还没有这么大。这些问题暂时没有提到议程上来。这个方案也只是提供了一些思路,

SSO其实没有什么标准,完成可以通过自已项目中需要什么样的去开发就好。能保持状态,能判断登录就行。也不用限定语言,我们项目中使用的是Golang.

我这里贴一部分,服务端用到的部分缓存结构

//sso存的cookie缓存
1 sso_cookie:111111 {
"user_token":"123456"
"type":"USER.SSO.COOKIE"
} //访问token与用户token对应关系
2 Login_User_token:888888 {
user_token:123456
service:"a.com"
} Login_User_token:999999 {
user_token:123456
service:"b.com"
"type":"USER.ACCESS_TOKEN" } //用户token
3 Token:123456 {
"userid":"111111"
"username”:”test"
"type":"USER.REGULAR"
}

如上,用户在网站A,B上的访问token(888888,999999)都对应到用户token(123456)这个用户上面

来点高逼格的,使用前端Sendmessage实现SSO的更多相关文章

  1. hexo——轻量、简易、高逼格的博客

    背景 写blog虽然经历了N多不同时代的产品,恒久不变的始终是自己无人问津的网站.虽然没几个人看,还是隔断时间就要折腾一下.从最开始的wordpress,到tale,到现在的hexo,网站变得越来越简 ...

  2. 如何打造一个"逼格"的web前端项目

    最近利用空余的时间(坐公交车看教程视频),重新了解了前后端分离,前端工程化等概念学习,思考如何打造一个“逼格”的web前端项目. 前端准备篇 前端代码规范:制定前端开发代码规范文档. PS:重中之中, ...

  3. 如何以python风格高逼格的改成购物车逻辑

    之前有一篇博文写到关于购物车的业务逻辑,分别运用cookie和redis存储未登录和登录用户的购物车数据,虽然已经很好的完成了业务逻辑,但是会发现代码的冗余很严重,也不够具有python特色,今天就让 ...

  4. js原生高逼格插件

    如何定义一个高逼格的原生JS插件 作为一个前端er,如果不会写一个小插件,都不好意思说自己是混前端界的.写还不能依赖jquery之类的工具库,否则装得不够高端.那么,如何才能装起来让自己看起来逼格更高 ...

  5. 高逼格的实现WiFi共享,不安装第三方wifi共享软件,两种方式实现开启wifi的功能

    作为一枚程序员,不会点高逼格的doc命令,那么都有点感觉对不起自己的行业了,好了废话就到这里了   第一种方式: 首先使用cmd命令:window键+R 然后输入cmd回车 第一种方式: 第一步: 设 ...

  6. VopSdk一个高逼格微信公众号开发SDK(源码下载)

    看之前回复很多说明大家很有热情&文章被误删掉了,不想让有的朋友错失这个高逼格的东西,现在重新发布,这次就直接放出源码,文章最末下载地址. 看之前回复很多说明大家很有热情&文章被误删掉了 ...

  7. VopSdk一个高逼格微信公众号开发SDK:自动化生产(装逼模式开启)

    VopSdk一个高逼格微信公众号开发SDK(源码下载) VopSdk一个高逼格微信公众号开发SDK:自动化生产(装逼模式开启) 针对第一版,我们搞了第二版本,老规矩先定个目标. 一 我们的目标 a.移 ...

  8. 多服务器终端交互利器--polysh和atnodes到高逼格日志中心

    最近博客更新的少了,相对而言,我在自己的个人公众号里还是挺活跃的,大家可以扫描旁边的二维码,或者微信搜索公众号:“编程一生”加关注. 在分布式的年代,一个应用需要部署到多台服务器上.那么要查看日志文件 ...

  9. 分享几套生成iMac相关高逼格免费mockup的素材和在线工具

    好久没有过来转, 今天姐姐我分享几套高逼格的iMac相关设计资源, 希望各位靓妹帅哥会喜欢, 最重要滴是,都是FREE,此处应有掌声~~~ , yeah!! iMac桌面效果Mockup 只需要下载后 ...

随机推荐

  1. 【C#】学习笔记(1) Delegates,Events,Lambda Expressions

    C#是跟着杨老师的教程走的,在这里感谢一下老师的无私奉献,他的cnblog地址:>cgzl,他的B站地址:>solenovex. 进入正题: Delegate表示委托,委托是一种数据结构, ...

  2. Python 字符串用法总结

    一.将某个对象转换为字符串,有str()和repr()两种方法 区别:repr() 转化为供解释器读取的形式str() 转化为适于人阅读的形式 a = 123456 print('repr输出:', ...

  3. netcore之RabbitMQ入门

    简介 RabbitMQ是实现了高级消息队列协议(AMQP)的开源消息中间件,基于Erlang语言编写. AMQP是什么 AMQP 0-9-1(高级消息队列协议)是一种消息传递协议,它允许一致的客户端应 ...

  4. C语言中的volatile关键字简介

    C语言中的volatile关键字简介: (1)含义:         volatile关键字的意思是可能会被外来的意想不到的改变.它的作用是:优化器在使用该关键字定义的变量时,直接从内存中读取原始的数 ...

  5. vuejs利用props,子组件修改父组件的数据,父组件修改子组件的的数据,数据类型为数组

    博文参考 传送们点一点 父组件: <template> <div> <aa class="abc" v-model="test" ...

  6. Django 的ORM 表间操作

    Django之ORM表间操作   之前完成了简单的数据库数据增加操作.这次学习更多的表间操作. 单表操作 增加 方式一 b = Book(title="Python基础", pub ...

  7. Python—序列化和反序列化模块(json、pickle和shelve)

    什么是序列化 我们把对象(或者变量)从内存中变为可存储或者可传输的过程称为序列化.在python中为pickling,在其他语言中也被称之为serialization,marshalling,flat ...

  8. 讲解web服务所涉及到的重要知识点

    HTTP:超文本传输协议,默认为TCP的80端口.带有超级链接的文本,而这些链接成为超链接! loadrunner :专业级测试工具,模拟你的应用程序的真实,进行评测! HTML:超文本编辑语言. H ...

  9. LR11录制手机/pad App脚本多种方法介绍(Mobile App补丁包)

    总体来说,通过LR录制手机脚本的方式有三种:1)通过代理方式录制,保证手机电脑在同一个网段:2)通过抓包录制,在手机上安装Mobile Recorder:3)通过安卓模拟器录制,本地安装android ...

  10. selenium五十行代码自动化爬取淘宝

    先看一下代码,真的只是五十行: # coding=gbk from selenium import webdriver import time options = webdriver.ChromeOp ...