说到单点登录大家都很了解,一个站点登录其他域会自动登录。

单点登录SSO(Single Sign On)的方法有很多,比如:p3p、共享session、共享cookice、第三方OAuth认证。

这里模拟淘宝、天猫登录。是模拟噢,要做到安全就要进行很多安全验证RSA加密了,带签名的参数了等。

淘宝与天猫登录时都是在淘宝登录,登录后redirect跳转到各自的网站HTTP_REFERER。

本地模拟,MY淘宝:http://my-taobao.com:8080/      My天猫:http://my-tmall.com/

为什么本地模拟的时候要修改一个的默认端口80为8080或其他端口,参考:http://www.cnblogs.com/dcb3688/p/4608003.html

My淘宝有三个文件,分别是:index.php login.php 与api.php

index.php

<?php
session_start();
$session_name= isset($_SESSION['name'])?$_SESSION['name']:'';
$session_token= isset($_SESSION['token'])?$_SESSION['token']:''; if($session_name){
echo "<strong>{$session_name}</strong>您已登录My-Taobao.com &nbsp; <a href='/api.php?action=logout&token={$session_token}'>退出</a>";
}else{
echo "您还未登录My-Taobao.com &nbsp; <a href='/login.php'>登录</a>";
}

login.php

<meta charset="utf-8"/>
<form action="api.php" method="post">
<input type="text" name="name">
<input type="hidden" name="action" value="login">
<input type="hidden" name="redirect" value="<?php echo $_SERVER['HTTP_REFERER'] ?>">
<input type="submit">
</form>
<?php

session_start();
$session = isset($_SESSION['token']) ? $_SESSION['token'] : '';
$redirect = isset($_REQUEST['redirect']) ? $_REQUEST['redirect'] : "/";
$action = isset($_POST['action']) ? $_POST['action'] : '';
/**
* post 登录
*/
if ($action == 'login') {
if ($session) { #已经是登录的状态
echo '<meta charset="UTF-8"><script type="text/javascript">window.location.href = "' . $redirect . '";</script>';
}
$session = md5(time() . uniqid());
$_SESSION['token'] = $session;
$_SESSION['name'] = $_POST['name'];
$_SESSION['create_time'] = time(); if (!is_dir('session')) {
mkdir('session');
}
$fopen = fopen('session/' . $_SESSION['token'], 'w+'); //新建文件命令
fputs($fopen, serialize($_SESSION)); //向文件中写入内容;
fclose($fopen); exit('<meta charset="UTF-8"><script type="text/javascript">window.location.href = "' . $redirect . '";</script>');
} /**
* curl登录验证
*/
if ($action == 'curl_valid') {
$token = isset($_POST['token']) ? $_POST['token'] : '';
$res = 0;
if ($token) {
if (file_exists('session/' . $token)) { # 存在该文件
$data = unserialize(file_get_contents('session/' . $token));
if (isset($data['create_time'])) {
if ($data['create_time'] > time() - 7200) {
$res = 1;
}
}
}
} exit( json_encode(["status"=>$res]));
} /**
* get 退出
*/
$actionLogout = isset($_GET['action']) ? $_GET['action'] : '';
if ($actionLogout == 'logout') {
if (isset($_GET['token'])) {
unlink("session/".$_SESSION['token']);
unset($_SESSION['token']);
unset($_SESSION['name']);
}
exit('<script type="text/javascript">window.location.href = "' . $_SERVER['HTTP_REFERER'] . '";</script>');
} /**
* jsonp 访问
*/
$jsonp = isset($_GET['jsonp_callback']) ? $_GET['jsonp_callback'] : '';
if ($jsonp) {
$status = 0;
$node = [];
$msg = '';
if (isset($_SESSION['token'])) {
$status = 1;
$msg = 'success';
$node = $_SESSION;
} else {
$msg = 'fail';
}
exit($jsonp . '(' . json_encode(['status' => $status, 'msg' => $msg, 'node' => $node]) . ')');
}

My天猫有两个文件: index.php 与 list.php

index.php

<span id="line">

</span>
<script src="http://yiiui.com/static/v1/JUI/js/jquery-1.7.2.min.js"></script> <script > /**
* 获取cookie
*/
function getCookie(cookiename) {
var result;
var mycookie = document.cookie;
var start2 = mycookie.indexOf(cookiename + "=");
if (start2 > -1) {
start = mycookie.indexOf("=", start2) + 1;
var end = mycookie.indexOf(";", start); if (end == -1) {
end = mycookie.length;
}
result = unescape(mycookie.substring(start, end));
}
return result;
}
/**
* 设置cookie
*/
function setCookie(name, value) {
var Days = 30;
var exp = new Date();
exp.setTime(exp.getTime() + Days * 24 * 60 * 60 * 1000);
document.cookie = name + "=" + escape(value) + ";expires=" + exp.toGMTString();
} var token = getCookie("token"); if (token === null) { // 首次访问my-tmall.com // php curl 不能获取session因为curl是服务器端请求,jsonp是本地的客户端请求。
$.getJSON("http://my-taobao.com:8080/api.php?jsonp_callback=?", function (data) {
if (data.status == 1) {
data = data.node;
setCookie('token', data.token);
console.log(data);
$("#line").html("<strong>" + data.name + "</strong>您已登录My-Tmall.com &nbsp; <a href='http://my-taobao.com:8080/api.php?action=logout&token=" + data.token + "'>退出 </a>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<a href='list.php'>列表</a>");
} else {
$("#line").html("您还未登录My-Tmall.com &nbsp; <a href='http://my-taobao.com:8080/login.php'>登录</a>");
}
});
} else { // 已经登录过,查询现在登录状态
$.getJSON("http://my-taobao.com:8080/api.php?jsonp_callback=?", function (data) {
if (data.status == 1) { // 登录
data = data.node;
if (data.token != token) { // 登陆其他账户了
setCookie('token', data.token);
window.location.href = document.location.href;
} else {
$("#line").html("<strong>" + data.name + "</strong>您已登录My-Tmall.com &nbsp; <a href='http://my-taobao.com:8080/api.php?action=logout&token=" + data.token + "'>退出</a>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<a href='list.php'>列表</a>");
}
} else { // 未登录
$("#line").html("您还未登录My-Tmall.com &nbsp; <a href='http://my-taobao.com:8080/login.php'>登录</a>");
}
});
} </script>

list.php

<?php

$token = isset($_COOKIE["token"]) ? $_COOKIE["token"] : '';
//print_r($token); $curl = curl(["action" => 'curl_valid', "token" => $token], "http://my-taobao.com:8080/api.php");
$ac = json_decode($curl, TRUE); if (isset($ac['status']) && $ac['status'] == 1) { # 登录中
echo '<ul>'
. '<li>1111</li>'
. '<li>2222</li>'
. '<li>3333</li>'
. '<li>4444</li>'
. '<li>5555</li>'
. '</ul>';
} else {
echo '已退出';
} function curl($data, $url, $method = 'POST', $headers = array()) {
$ch = curl_init();
$method_upper = strtoupper($method);
if ($method_upper == 'POST') {
curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt($ch, CURLOPT_POSTFIELDS, $data);
} else {
$url = $url . (strpos($url, '?') ? '&' : '?') . (is_array($data) ? http_build_query($data) : $data);
curl_setopt($ch, CURLOPT_URL, $url);
}
curl_setopt($ch, CURLOPT_CUSTOMREQUEST, $method_upper);
curl_setopt($ch, CURLOPT_FOLLOWLOCATION, 1);
curl_setopt($ch, CURLOPT_AUTOREFERER, 1);
curl_setopt($ch, CURLOPT_TIMEOUT, 30);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false); //SSL 报错时使用
curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, false); //SSL 报错时使用
if ($headers) {
curl_setopt($ch, CURLOPT_HTTPHEADER, $headers);
}
$tmpInfo = curl_exec($ch);
if (curl_errno($ch)) {
exit(curl_error($ch));
}
curl_close($ch);
return $tmpInfo;
}

很简单的原理,My淘宝是正常网站登录与注销(主站)。当任何一个网站登录且访问My天猫,My天猫就Jsonp请求当前浏览器中是否登录过MY淘宝。如果登录过就种下一个cookice保存MY淘宝sessionKey。

当要访问My天猫其他页面的时候可直接通过获取Cookice使用php的CURL请求网站MY淘宝是否登录。

php单点登录之模拟淘宝天猫同步登录的更多相关文章

  1. [淘宝客技术篇008](无需登录)淘宝天猫优惠券JSON接口1

    今天,小星给大家分享的是一个非常重要,非常有意义的接口:获取淘宝天猫优惠券的JSON接口. 先上个链接: http://uland.taobao.com/cp/coupon_list?pid=mm_2 ...

  2. 简单的抓取淘宝关键字信息、图片的Python爬虫|Python3中级玩家:淘宝天猫商品搜索爬虫自动化工具(第一篇)

    Python3中级玩家:淘宝天猫商品搜索爬虫自动化工具(第一篇) 淘宝改字段,Bugfix,查看https://github.com/hunterhug/taobaoscrapy.git 由于Gith ...

  3. <day003>登录+爬取淘宝商品信息+字典用json存储

    任务1:利用cookie可以免去登录的烦恼(验证码) ''' 只需要有登录后的cookie,就可以绕过验证码 登录后的cookie可以通过Selenium用第三方(微博)进行登录,不需要进行淘宝的滑动 ...

  4. selenium模拟淘宝登陆,过所有验证

    淘宝模拟登陆实现 由于淘宝使用了滑动验证码,需要进行模糊手动滑动,因此考虑使用selenium+chromedriver进行模拟登陆. 淘宝的登陆网址:https://login.taobao.com ...

  5. 淘宝天猫关键词SEO优化

    淘宝天猫的网站完全像是一个成熟的搜索引擎,只是从google.bing.baidu改成了淘宝天猫而已,普通搜索引擎有品专,有皇冠,有PC,有无线:淘宝天猫里面有钻展,有直通车,也有PC,无线.搜索引擎 ...

  6. Python网页信息采集:使用PhantomJS采集淘宝天猫商品内容

    1,引言 最近一直在看Scrapy 爬虫框架,并尝试使用Scrapy框架写一个可以实现网页信息采集的简单的小程序.尝试过程中遇到了很多小问题,希望大家多多指教. 本文主要介绍如何使用Scrapy结合P ...

  7. 【淘宝客】根据淘客联盟精选清单(淘宝天猫内部优惠券)随机显示淘宝天猫优惠券dome

    也许大家在生活中经常淘宝看到[淘宝天猫内部优惠券]的网站,或者在微博中经常有博主发券,让大家生活中购物便宜许多,作为一个站长,我们也希望自己的网站也能有这样的一个功能,现在就分享给大家,还是免后台哦. ...

  8. 浅析 阿里 OceanBase 双十一 淘宝天猫 天量交易 承载能力 原理

    我们先看看 这 2 篇文章: <秘诀!支付宝支撑双十一4200万次/秒的数据库请求峰值的技术实现>  https://mp.weixin.qq.com/s?__biz=MzI3MzEzMD ...

  9. iOS 集成阿里百川最新版(3.1.1.96) 实现淘宝授权登录以及调用淘宝客户端商品详情页

      公司最近要做第三方登录,由于是做导购项目,必不可少的有淘宝的授权登录.本来就是一个授权登录,没什么大不了的.但淘宝的无线开放业务——阿里百川更新的最新版本3.1.1.96,开发文档不是不详细,是很 ...

随机推荐

  1. Matlab插值函数

    x=0:2*pi; y=sin(x); xx=0:0.5:2*pi; %interp1对sin函数进行分段线性插值,调用interp1的时候,默认的是分段线性插值 y1=interp1(x,y,xx) ...

  2. iconfont使用,亲测

    iconfont对于前端应用来说有很多便捷: 1.自由变化大小 2.自由修改颜色 3.可以添加一些视觉效果如:阴影.旋转.透明度. 4.兼容IE6 在线引用和下载到本地两种方法 一.在线引用 图标的制 ...

  3. JQuery中$.each 和$(selector).each()的区别详解

    PS:晚上在写页面时,发现了一个问题,$.each 和$(selector).each()有哪些区别?百度搜索关键词,首页显示出来一些前人的经验,总结一下,发上来. 1.$(selector).eac ...

  4. C#大数据文本高效去重

    C#大数据文本高效去重 转载请注明出处 http://www.cnblogs.com/Huerye/ TextReader reader = File.OpenText(@"C:\Users ...

  5. Money, save or spend, this is a problem .

    Win a lottery? Had a great hand at the casino? Did fortune shine upon you in the stock market? 彩票中了大 ...

  6. hdu2005第几天?

    Problem Description 给定一个日期,输出这个日期是该年的第几天.   Input 输入数据有多组,每组占一行,数据格式为YYYY/MM/DD组成,具体参见sample input , ...

  7. Linux系统启动过程

    1. 从BIOS到KERNEL BIOS自检->MBR(GRUB)->KERNEL->KERNEL自解压->内核初始化->内核启动 BIOS自检 当电脑开机的时候,电脑会 ...

  8. Burp Suite新手指南

    Burp Suite想必大家都用过,但是大家未必知道它的所有功能.因此,本文的主要目的就是尽量深入介绍各种功能.BurpSuite有以下这些功能: 截获代理– 让你审查修改浏览器和目标应用间的流量. ...

  9. collections 模块(namedtuple, deque, Counter )

    基本介绍 我们都知道,Python拥有一些内置的数据类型,比如str, int, list, tuple, dict等, collections模块在这些内置数据类型的基础上,提供了几个额外的数据类型 ...

  10. 【JavaScript】JS 中 原始字符串 和 HTML 字符转换

    参考资料:http://www.sjyhome.com/javascript/js-html-escape.html JS转换HTML转义符 SJY • 发表于:2013年10月05日 17:04 • ...