PHP实现跨域单点登录

fightdolia 2013-10-21 02:59:59
最近公司需要制作单点登录系统,于是我一直在搜寻各种资料寻找最优化的单点登录制作方式,最后综合了各种想法,完成了单点登录系统,下面给大家分享下,我实现的单点登录的方式:

原文转自:http://www.W3PHP.com W3PHP

单点登录(Single Sign On),简称为 SSO,是目前比较流行的企业业务整合的解决方案之一。SSO的定义是在多个应用系统中,用户只需要登录一次就可以访问所有相互信任的应用系统。(百度百科)

我本人认为单点登录主要解决一下问题:

1. 一个用户账号,多站点通用;
2. 一个应用登录,其他应用同时登录;
3. 一个账号退出,其他应用账号同时退出;(非必须,此项不在单点登录的讨论范围之内,不过WEB单点登录,用到的还是挺多的);
4. 欢迎补充

PHP实现单点登录方法有多种:

1. 通过关系服务 如webservice 之类的;
2. 数据库共享session实现;
4. P3P跨站点 如ucenter phpcms 等;
5. 通过文件操作 SESSIONID
6. 欢迎补充

我使用的是第5种方法,下面简单说下实现:

一 登陆原理说明

我把SSO分为三个角色:

1. 客户端 – 指的是用户的浏览器
2. 代理端 – 指的是用户访问的网站;
3. 服务端 - 单点登录服务端,提供用户信息方;

同域实现SESSION共享非常容易,但是跨域实现网站和单点登录服务器共享SESSION,就需要做些手脚了;我是这样做的:


二. 过程说明:

登陆流程:

1. 第一次登陆某个站:

a) 站点生成随机字符串TOKEN,保存在cookie中,并携带加密过的APPID,APPKEY URL跳转到单点登录服务器;单点登录服务器则解密APPID 和APPKEY并去验证站点合法性;同时单点登录服务端会启动SESSION,并根据TOKEN在单点登录服务端的SESSION生成路径,同时生成以TOKEN为文件名的SESSION_TOKEN,把开始启动SESSION的PHPSSID,写入伪SESSION_TOKEN中,实现SESSION共享,然后使客户端跳转至原来的站点URL;

a) 用户输入用户名+密码,向用户验证中心发送登录请求

b) 当前登录站点,通过CURL请求,用户验证中心验证用户名,密码的合法性。如果验证通过,则返回用户信息,不通过则返回错误信息;

c) 根据上一步的CURL请求返回的结果,当前子站对用户进行登陆处理,如果接受到错误,则进行错误处理;

2. 登陆状态下,用户转到另一子:

a) 通过本站cookie或session验证用户的登录状态:如验证通过,进入正常本站处理程序;不通过则重复第一次登陆步骤;











...全文
2433 9 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
9 条回复
切换为时间正序
请发表友善的回复…
发表回复
indexroot 2014-12-12
  • 打赏
  • 举报
回复
感谢分享 顶下
超级会员VIP 2014-12-12
  • 打赏
  • 举报
回复
比如有1.abc.com和2.abc.com两个子域名,登录服务器为accounts.abc.com,如果在1.abc.com上登录了,在2.abc.com上传什么参数判断是否显示过呢?
jiguoguo 2013-10-24
  • 打赏
  • 举报
回复
自己研究模拟登录的资料 建议思路 1。下载fiddler 了解http请求。头体 2.下载一个 snoopy的类。我觉得不错。比curl好。很多空间不支持curl。 3.看网站登录传入参数服务器响应返回的session--客户端会有个cookies的。 记录有用信息。带到下一个线程内。就可以模拟登录了。浏览需要登录后的网址了 基本上都可以搞定。https搞不定
go-sunny 2013-10-23
  • 打赏
  • 举报
回复
还有一种更简单的方法,每次登入成功后,生成了token,保存到cookie中,并写入到用户登录信息表里面。第二次登入时,更新token,并写入到数据库。如果之前有人已经登录了,那他从原来的cookie中获取到token,使用这个token到数据库里面查询,这样,就查询不到了(已经被更新),这样程序把他提下线了
流浪人_is_me 2013-10-22
  • 打赏
  • 举报
回复
你这个可以实现不在同一个域名下的登陆同步吗
Hx_Moon_ 2013-10-22
  • 打赏
  • 举报
回复
引用 1 楼 yulongshuai 的回复:
如果已登录状态,跳转到另一子站,验证的时候是在url后面加验证信息的吗?
根据curl请求验证数据是否正确就行
fbbin 2013-10-22
  • 打赏
  • 举报
回复
最靠谱的还是想UC那种P3P了吧。。。
432345 2013-10-22
  • 打赏
  • 举报
回复
引用 2 楼 linux_PHP_ 的回复:
引用 1 楼 yulongshuai 的回复:
如果已登录状态,跳转到另一子站,验证的时候是在url后面加验证信息的吗?
根据curl请求验证数据是否正确就行
另一子站怎么验证?怎么得到那些验证信息。比如a.xx.com登录了,然后直接在地址上输入b.xx.com,这样可以通过吗?
432345 2013-10-21
  • 打赏
  • 举报
回复
如果已登录状态,跳转到另一子站,验证的时候是在url后面加验证信息的吗?

20,398

社区成员

发帖
与我相关
我的任务
社区描述
“超文本预处理器”,是在服务器端执行的脚本语言,尤其适用于Web开发并可嵌入HTML中。PHP语法利用了C、Java和Perl,该语言的主要目标是允许web开发人员快速编写动态网页。
phpphpstorm 技术论坛(原bbs)
社区管理员
  • 开源资源社区
  • phpstory
  • xuzuning
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧