关于什么叫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. Spring MVC的常用注解(一)

    概述 Spring从2.5版本开始引入注解,虽然版本不断变化,但是注解的特性一直被延续下来并不断进行扩展,这里就来记录一下Spring MVC中常用的注解,本文记录@Controller.@Reque ...

  2. Qt开源编辑器qsciscintilla的一些用法

    首先放一张自己做的软件中的编辑器的效果图 中间红色的框就是放在Qt的tabwidget控件中的qsciscintilla编辑器 先从官网下载qsciscintilla源码,在qtcreater中编译, ...

  3. Python继承、多继承、魔术方法

    继承和多继承的概念和使用 super的用法 __str__ __repr__ __call__ 多继承方法解析顺序和Mix-in开发模式 魔术方法原理和作用 继承 定义类的时候,在类名后面的括号里填继 ...

  4. [日常] 神奇的引导问题deepin与win10

    经过昨天的一番折腾,我的电脑一开机就可以进入deepin的引导界面,也可以登录到deepin,但是访问windows直接报错.我的windows已经使用PE安装完了win10,还是打不开. 当我在研究 ...

  5. 基础知识 wps去广告

    原文:http://www.360doc.com/content/19/0618/15/38017100_843312032.shtml 原文:http://wps.crcc.cn/

  6. node爬虫之图片下载

    背景:针对一些想换头像的玩家,而又不知道用什么头像的,作为一名代码爱好者,能用程序解决的,就不用程序来换头像,说干就干,然后就整理了一下. 效果图 环境配置 安装node环境 node -v node ...

  7. MySQL实战45讲学习笔记:第四十五讲

    一.本节概述 MySQL 里有很多自增的 id,每个自增 id 都是定义了初始值,然后不停地往上加步长.虽然自然数是没有上限的,但是在计算机里,只要定义了表示这个数的字节长度,那它就有上限.比如,无符 ...

  8. zlib压缩相关

    相关原理 deflate(RFC1951):一种压缩算法,使用LZ77和哈弗曼进行编码: zlib(RFC1950):一种格式,是对deflate进行了简单的封装,他也是一个实现库(delphi中有z ...

  9. 有关tab页的

    有关tab页的 1.静态的 2.动态的可以删除的 3.删除右侧,左侧,全部,除了自己以外的. 4.多了可以自动伸缩. 5.带shown事件.可以反向影响菜单去.

  10. tensor 中mul_,add_解读

    pytorch 中文网文档链接 https://ptorch.com/docs/1/Tensor 每一个张量tensor都有一个相应的torch.Storage保存其数据,张量类提供了一个多维的,横向 ...