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请求。
大公司都会这样去做,
如淘宝登录了,到了天猫又要登录,啊有点烦。
需要实现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请求。
相关文章推荐
- node起步(安装,建立服务,事件式编程)-01
- 19. Remove Nth Node From End of List [easy] (Python)
- Hadoop-2.4.1源码分析--HDFS HeartBeat(心跳检测)之NameNode端处理数据块增量汇报
- Hadoop-2.4.1源码分析--HDFS HeartBeat(心跳检测)之DataNode端数据块增量汇报
- hadoop Data上jps不出现Datanode
- 1115. Counting Nodes in a BST (30)
- Xml中SelectSingleNode方法,xpath查找某节点用法
- Remove Nth Node From End of List - JS
- Print Boundry Nodes of a binary tree.
- Node request pipe
- Node request
- erlang remote node
- 测试框架:ava
- NodeJs使用asyncAwait两法
- 从node.js想到的
- node定时器详解
- node.js 安装cnpm nodemon express pm2 node-inspector
- nodejs websocket 把下面错误
- node.js npm 配置相关
- node-webkit 笔记