单点登录,在多个域名环境下,一处登录,多处使用。
大公司都会这样去做,
如淘宝登录了,到了天猫又要登录,啊有点烦。
需要实现a.com 上登录了,b.com上也登录成功了。
访问b.com时就不必再登录了。
b.com 退出了,a.com也退出了。
需要解决的问题是绕过同源策略。
因为a.com是不能向b.com写cookie的。
解决办法,向a.com发起jsonp请求。
a.com 响应后跳转到b.com
b.com执行写入cookie.
并返回jsonp响应。
a.com 页面里接受到回调数据。
在页面发起jsonp请求时,
需要把crossDomain设置成true
在jquery 里在1.5版本后新添加的属性
同域为false 跨域为true
如服务器需要重定向到其他域,需要设置成true.
node 后端写法:
var express=require('express');
var path=require('path');
var http=require('http');
//body中间值在4.X以后分成了子模块
var bodyParser = require('body-parser');
var cookieParser = require('cookie-parser'); //如果要使用cookie,需要显式包含这个模块
var app=express();
var port=process.env.PORT || 3001;
app.use(bodyParser());
app.use(cookieParser());
app.use(express.static(path.join(__dirname, 'public')));//设置静态文件夹
app.all('*',function(req,res,next){
res.header("Access-Control-Allow-Origin", "*");
//res.writeHeader(200, {'Content-Type':'application/json'});
next();
})
app.get('/redirect',function(req,res){
var call=req.query.callback;
res.redirect('http://127.0.0.1:3001/setcookie?call='+call)
})
app.get('/setcookie',function(req,res){
//b域写入cookie
//p3p 第三方协议 允许第三方访问b上的cookie
//chrome浏览器是支持的,ie需要配置允许。
//需要在头配置
res.header('P3P',"CP=CURa ADMa DEVa PSAo PSDo OUR BUS UNI PUR INT DEM STA PRE COM NAV OTC NOI DSP COR")
var call=req.query.call;
res.cookie('userid','id_'+call);
res.send(call+'("ok")')
})
app.get('/getcookie',function(req,res){
res.send('getcookie')
})
app.get('/readercookiejsonp',function(req,res){
var call=req.query.callback;
var userid=req.cookies.userid;
console.log(userid);
res.send(call+'("'+userid+'")')
})
http.createServer(app).listen(port,function(){
console.log('express server listen port'+port);
})
以上是代码。
有几个需要注意的地方:
1、需要设置请求允许访问origin
2、重定向时把call传递
3、b.com上在返回头部需配置P3P
默认chrome不配置也可以,但是ie8以下不行。
需要配置,允许第三方访问cookie.
4、b.com上需要接受call 并返回jsonp格式数据。
5、当a.com上需要访问b.com上cookie时,发请jsonp请求。