关于什么叫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. linux下编译安装MariaDB 10.4.7,解决错误:cannot access ‘/auth_pam_tool_dir’: No such file or directory

    编译安装MariaDB 10.4.7,前面的步骤我就不复述了,一切正常没什么问题. 当执行到:scripts/mysql_install_db --basedir=/usr/local/mysql - ...

  2. 常见的Web源码泄露总结

    常见的Web源码泄露总结 源码泄露方式分类 .hg源码泄露 漏洞成因: hg init 的时候会生成 .hg 漏洞利用: 工具: dvcs-ripper .git源码泄露 漏洞成因: 在运行git i ...

  3. 关于UIScollView中的contentOffset的理解

    大家对UIScollView 中的contentOffset 一直有疑问. 当时我也有好多疑问,后来在网上找了一下资料,发现没有找到合理的解释,因此自己就查看了一下官方文档,自己好好的研究了一番. 现 ...

  4. XCode保存问题

    1. 确认下证书是不是开发证书,如果是发布证书就会出现这样的提示. 2. 证书失效了,去开发者中心重新生成一个. 3. 包标识符不与描述文件包含的包标识符不一致,按照它的提示换一下就好了,最好不要点 ...

  5. NSURLSession的知识小记

    1.NSURLSession的使用流程 使用NSRULSession对象创建Task, 然后执行Task 2.获取NSURLSession ()获得共享的Session + (NSURLSession ...

  6. INSTALL_FAILED_TEST_ONLY

    查看博客:http://www.enjoytoday.cn/posts/159 Android studio安装apk无法安装,报错误,网上搜索可以看到都说是:* 调用者不被允许测试的测试程序*,但具 ...

  7. 去掉没用的参数的warning

    #define UNUSED(x) ((void)(x)) void fun(int noused_arg, int b){ UNUSED(noused_arg); printf("%d\n ...

  8. Python函数作用域和匿名函数

    匿名函数的定义 全局变量和局部变量的概念 global(全局变量)和 nonlocal(局部变量) 闭包.递归.回调 匿名函数 匿名函数  lambda 语法规则:lambda   参数 : 表达式 ...

  9. Jmeter获取数据库查询结果某一字段的值

    1.首先进行连接数据库 2.添加JDBC Request 3.添加BeanShell PostProcessor 4.注意点:如果获取的是INT数字类型的,结尾需要添加toString()

  10. Jenkins+Jmeter配置(Linux环境)

    1.安装jenkins. 1.1在Linux服务器上,必须先安装jdk与Tomcat, 在/opt/tools/tomcat 安装解压Tomcat 1.2.在Linux服务器上安装jmeter 在/o ...