PHP不到100行代码实现SSO单点登录
1、点击登录跳转到SSO登录页面并带上当前应用的callback地址
2、登录成功后生成COOKIE并将COOKIE传给callback地址
3、callback地址接收SSO的COOKIE并设置在当前域下再跳回到应用1即完成登录
4、再在应用程序需要登录的地方嵌入一个iframe用来实时检测登录状态
- <?php
- //index.php 应用程序页面
- header('Content-Type:text/html; charset=utf-8');
- $sso_address = 'http://2spaoku.com/sso/login.php'; //你SSO所在的域名
- $callback_address = 'http://'.$_SERVER['HTTP_HOST']
- .str_replace('index.php','',$_SERVER['SCRIPT_NAME'])
- .'callback.php'; //callback地址用于回调设置cookie
- if(isset($_COOKIE['sign'])){
- exit("欢迎您{$_COOKIE['sign']} <a href=\"login.php?logout\">退出</a>");
- }else{
- echo '您还未登录 <a href="'.$sso_address.'?callback='.$callback_address.'">点此登录</a>';
- }
- ?>
- <iframe src="<?php echo $sso_address ?>?callback=<?php echo $callback_address ?>" frameborder="0" width="0" height="0"></iframe>
复制代码
- <?php
- //login.php SSO登录页面
- header('Content-Type:text/html; charset=utf-8');
- if(isset($_GET['logout'])){
- setcookie('sign','',-300);
- unset($_GET['logout']);
- header('location:index.php');
- }
- if(isset($_POST['username']) && isset($_POST['password'])){
- setcookie('sign',$_POST['username'],0,'');
- header("location:".$_POST['callback']."?sign={$_POST['username']}");
- }
- if(empty($_COOKIE['sign'])){
- ?>
- <form method="post">
- <p>用户名:<input type="text" name="username" /></p>
- <p>密 码:<input type="password" name="password" /></p>
- <input type="hidden" name="callback" value="<?php echo $_GET['callback']; ?>" />
- <input type="submit" value="登录" />
- </form>
- <?php
- }else{
- $query = http_build_query($_COOKIE);
- echo "系统检测到您已登录 {$_COOKIE['sign']} <a href=\"{$_GET['callback']}?{$query}\">授权</a> <a href=\"?logout\">退出</a>";
- }
- ?>
复制代码
- <?php
- //callback.php 回调页面用来设置跨域COOKIE
- header('Content-Type:text/html; charset=utf-8');
- if(empty($_GET)){
- exit('您还未登录');
- }else{
- foreach($_GET as $key=>$val){
- setcookie($key,$val,0,'');
- }
- header("location:index.php");
- }
- ?>
复制代码
- <?php
- //connect.php 用来检测登录状态的页面,内嵌在页面的iframe中
- header('Content-Type:text/html; charset=utf-8');
- if(isset($_COOKIE['sign'])){
- $callback = urldecode($_GET['callback']);unset($_GET['callback']);
- $query = http_build_query($_COOKIE);
- $callback = $callback."?{$query}";
- }else{
- exit;
- }
- ?>
- <html><script type="text/javascript">top.location.href="<?php echo $callback; ?>";</script></html>
复制代码
演示地址:http://tmkook.com/blog/sso/
源文地址:http://tmkook.com/blog/archives/php-sso
PHP不到100行代码实现SSO单点登录的更多相关文章
- 【转】100行代码实现最简单的基于FFMPEG+SDL的视频播放器
FFMPEG工程浩大,可以参考的书籍又不是很多,因此很多刚学习FFMPEG的人常常感觉到无从下手.我刚接触FFMPEG的时候也感觉不知从何学起. 因此我把自己做项目过程中实现的一个非常简单的视频播放器 ...
- 100行代码实现现代版Router
原文:http://www.html-js.com/article/JavaScript-version-100-lines-of-code-to-achieve-a-modern-version ...
- 用JavaCV改写“100行代码实现最简单的基于FFMPEG+SDL的视频播放器 ”
FFMPEG的文档少,JavaCV的文档就更少了.从网上找到这篇100行代码实现最简单的基于FFMPEG+SDL的视频播放器.地址是http://blog.csdn.net/leixiaohua102 ...
- 100行代码实现最简单的基于FFMPEG+SDL的视频播放器(SDL1.x)【转】
转自:http://blog.csdn.net/leixiaohua1020/article/details/8652605 版权声明:本文为博主原创文章,未经博主允许不得转载. 目录(?)[-] ...
- 100行代码让您学会JavaScript原生的Proxy设计模式
面向对象设计里的设计模式之Proxy(代理)模式,相信很多朋友已经很熟悉了.比如我之前写过代理模式在Java中实现的两篇文章: Java代理设计模式(Proxy)的四种具体实现:静态代理和动态代理 J ...
- GuiLite 1.2 发布(希望通过这100+行代码来揭示:GuiLite的初始化,界面元素Layout,及消息映射的过程)
经过开发群的长期验证,我们发现:即使代码只有5千多行,也不意味着能够轻松弄懂代码意图.痛定思痛,我们发现:虽然每个函数都很简单(平均长度约为30行),可以逐个击破:但各个函数之间如何协作,却很难说明清 ...
- 【编程教室】PONG - 100行代码写一个弹球游戏
大家好,欢迎来到 Crossin的编程教室 ! 今天跟大家讲一讲:如何做游戏 游戏的主题是弹球游戏<PONG>,它是史上第一款街机游戏.因此选它作为我这个游戏开发系列的第一期主题. 游戏引 ...
- 100行代码实现HarmonyOS“画图”应用,eTS开发走起!
本期我们给大家带来的是"画图"应用开发者Rick的分享,希望能给你的HarmonyOS开发之旅带来启发~ 介绍 2021年的华为开发者大会(HDC2021)上,HarmonyOS ...
- oauth2.0实现sso单点登录的方式和相关代码
SSO介绍 什么是SSO 百科:SSO英文全称Single Sign On,单点登录.SSO是在多个应用系统中,用户只需要登录一次就可以访问所有相互信任的应用系统.它包括可以将这次主要的登录映射到其他 ...
随机推荐
- linux ext2 文件系统学习
Linux ext2文件系统理解 硬盘组成: 硬盘由多个圆形硬盘片组成.按照硬盘片能够容纳的数据量分为单盘和多盘.硬盘的数据读取主要靠机械手臂上的磁头,在机械手臂上有多个磁头.机械手臂不动硬盘旋转一 ...
- 《GK101任意波发生器》升级固件发布(版本:1.0.2.build126)
一.固件说明: 硬件版本:0,logic.3 固件版本:1.0.2.build126 编译日期:2014-08-23 ====================================== 二. ...
- OpenCV学习笔记——形态学梯度操作
代码: #include<cv.h> #include<highgui.h> int main(void) { cvNamedWindow("cmp"); ...
- Grand Theft Auto V 图形研究(3)
原文链接 http://www.adriancourreges.com/blog/2015/11/02/gta-v-graphics-study-part-3/ Post Processing Eff ...
- Ubuntu下配置C/C++开发环境
在 Ubuntu 下配置 C/C++ 开发环境 转自:白巴的临时空间 Submitted by 白巴 on 2009-04-27 19:52:12. 学习笔记 虽然 Ubuntu 的版本已经是9.04 ...
- 20145225 实验四《Andoid开发基础》
实验内容 搭建Android环境 运行Android 修改代码,能输出学号 实验步骤 安装Android Studio 安装Android的SDK 运行Andriod Studio并在模拟手机上显示自 ...
- 云计算中心网络资源分配-Faircloud: sharing the network in cloud computing
网络资源同计算资源以及存储资源一样,是一种可被租户共享使用并提高利用率的资源.但是,不同租户的计算资源以及存储资源之间,有很强的隔离性,可以实现按需按比例分配的使用方式,但是网络资源却不可以. 主要原 ...
- REST性能测试方案
1.REST简介 REST(代表性状态传输,Representational State Transfer)是一种Web服务设计模型.REST定义了一组体系架构原则,您可以根据这些原则设计以系统资源为 ...
- img base64
<?php header('Content-type:text/html;charset=utf-8'); //读取图片文件,转换成base64编码格式 $image_file = './429 ...
- communication between threads 线程间通信 Programming Concurrent Activities 程序设计中的并发活动 Ada task 任务 Java thread 线程
Computer Science An Overview _J. Glenn Brookshear _11th Edition activation 激活 parallel processing 并行 ...