您的位置:首页 > Web前端 > Node.js

node 实现SSO

2016-06-16 14:00 441 查看
单点登录,在多个域名环境下,一处登录,多处使用。

大公司都会这样去做,

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

需要实现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请求。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: