node 实现SSO

来源:互联网 发布:淘宝1毛钱迅雷会员没了 编辑:程序博客网 时间:2024/06/09 15:51

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

大公司都会这样去做,

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

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




0 0
原创粉丝点击