node 实现SSO

单点登录,在多个域名环境下,一处登录,多处使用。

大公司都会这样去做,

如淘宝登录了,到了天猫又要登录,啊有点烦。

需要实现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请求。




评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值