php单点登录之模拟淘宝天猫同步登录
说到单点登录大家都很了解,一个站点登录其他域会自动登录。
单点登录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 <a href='/api.php?action=logout&token={$session_token}'>退出</a>";
}else{
echo "您还未登录My-Taobao.com <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 <a href='http://my-taobao.com:8080/api.php?action=logout&token=" + data.token + "'>退出 </a> <a href='list.php'>列表</a>");
} else {
$("#line").html("您还未登录My-Tmall.com <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 <a href='http://my-taobao.com:8080/api.php?action=logout&token=" + data.token + "'>退出</a> <a href='list.php'>列表</a>");
}
} else { // 未登录
$("#line").html("您还未登录My-Tmall.com <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单点登录之模拟淘宝天猫同步登录的更多相关文章
- [淘宝客技术篇008](无需登录)淘宝天猫优惠券JSON接口1
今天,小星给大家分享的是一个非常重要,非常有意义的接口:获取淘宝天猫优惠券的JSON接口. 先上个链接: http://uland.taobao.com/cp/coupon_list?pid=mm_2 ...
- 简单的抓取淘宝关键字信息、图片的Python爬虫|Python3中级玩家:淘宝天猫商品搜索爬虫自动化工具(第一篇)
Python3中级玩家:淘宝天猫商品搜索爬虫自动化工具(第一篇) 淘宝改字段,Bugfix,查看https://github.com/hunterhug/taobaoscrapy.git 由于Gith ...
- <day003>登录+爬取淘宝商品信息+字典用json存储
任务1:利用cookie可以免去登录的烦恼(验证码) ''' 只需要有登录后的cookie,就可以绕过验证码 登录后的cookie可以通过Selenium用第三方(微博)进行登录,不需要进行淘宝的滑动 ...
- selenium模拟淘宝登陆,过所有验证
淘宝模拟登陆实现 由于淘宝使用了滑动验证码,需要进行模糊手动滑动,因此考虑使用selenium+chromedriver进行模拟登陆. 淘宝的登陆网址:https://login.taobao.com ...
- 淘宝天猫关键词SEO优化
淘宝天猫的网站完全像是一个成熟的搜索引擎,只是从google.bing.baidu改成了淘宝天猫而已,普通搜索引擎有品专,有皇冠,有PC,有无线:淘宝天猫里面有钻展,有直通车,也有PC,无线.搜索引擎 ...
- Python网页信息采集:使用PhantomJS采集淘宝天猫商品内容
1,引言 最近一直在看Scrapy 爬虫框架,并尝试使用Scrapy框架写一个可以实现网页信息采集的简单的小程序.尝试过程中遇到了很多小问题,希望大家多多指教. 本文主要介绍如何使用Scrapy结合P ...
- 【淘宝客】根据淘客联盟精选清单(淘宝天猫内部优惠券)随机显示淘宝天猫优惠券dome
也许大家在生活中经常淘宝看到[淘宝天猫内部优惠券]的网站,或者在微博中经常有博主发券,让大家生活中购物便宜许多,作为一个站长,我们也希望自己的网站也能有这样的一个功能,现在就分享给大家,还是免后台哦. ...
- 浅析 阿里 OceanBase 双十一 淘宝天猫 天量交易 承载能力 原理
我们先看看 这 2 篇文章: <秘诀!支付宝支撑双十一4200万次/秒的数据库请求峰值的技术实现> https://mp.weixin.qq.com/s?__biz=MzI3MzEzMD ...
- iOS 集成阿里百川最新版(3.1.1.96) 实现淘宝授权登录以及调用淘宝客户端商品详情页
公司最近要做第三方登录,由于是做导购项目,必不可少的有淘宝的授权登录.本来就是一个授权登录,没什么大不了的.但淘宝的无线开放业务——阿里百川更新的最新版本3.1.1.96,开发文档不是不详细,是很 ...
随机推荐
- 制作宅基腐主页 && 制作个人简历--材料:BootStrap
宅基腐主页 主页分为四大板块:导航栏,轮播图,主页内容,相关信息. 导航栏:<nav>标签,class="navbar",navbar-inverse为反色,navba ...
- MongoDB笔记
mongodb简介 MongoDB 是一个基于分布式文件存储的数据库.存储的是Bson结构的文档(二进制的JSON),内部执行引擎为JS解释器,把文档存储为BSON结构,在查询时,转换为JS对象,可以 ...
- 12月5日PHPCMS替换主页
cms替换主页的步骤 1.先做好静态页面: 2.在D:\wamp\www\phpcms\install_package\phpcms\templates文件夹下建新的文件夹tianqiwangluo( ...
- thinkphp vendor
vendor('weixin.request'); 对应文件:Core\Library\Vendor\weixin\request.php import('weixin.request#class') ...
- Maven的安装及更改下载仓库
之前在MyEclipse这个IDE中配置Maven,完成配置后启动Maven时出现-Dmaven.multiModuleProjectDirectory system propery is not s ...
- 室内定位系列(三)——位置指纹法的实现(KNN)
位置指纹法中最常用的算法是k最近邻(kNN):选取与当前RSS最邻近的k个指纹的位置估计当前位置,简单直观有效.本文介绍kNN用于定位的基本原理与具体实现(matlab.python). 基本原理 位 ...
- 解决svn pritine text not exist问题
svn: E155032: The pristine text with checksum '$sha1$151400d1cd4c5fc190d500aa1826d45cb91f088f' not f ...
- Sql Server 学习链接
避免SQL全表查询:http://www.dedecms.com/knowledge/data-base/sql-server/2012/0821/11698.html?jdfwkey=n3nuq
- 通过代码自定义cell(cell的高度不一致,比如微博)
1.新建一个继承自UITableViewCell的类 2.重写initWithStyle:reuseIdentifier:方法 (先要调用父控件的nitWithStyle:reuseIdentifie ...
- python动态创建类的声明
动态创建类的声明 使用内置函数type,原型:class type(name, bases, dict)name是类的名字,相当于__class__bases是类的基类,元组,可以有多个基类,但是基类 ...