nodejs通过jsonp实现单点登录Demo

说明:使用redis作为session的存储方式
使用引入sso服务器中的动态js地址来获取cookie
应用服务器获取单点服务器提供的特殊标识比如sessionId其他后,
通过标识直接去往redis中去查询,或是提交(通过rpc)给单点服务器去查询获取登录信息结果

服务器代码示例

const Koa = require('koa');
const Router = require('koa-router');
const bodyParser = require('koa-bodyparser');
const app = new Koa(); 
const router = new Router(); 
app.use(bodyParser());
//====session s=====
var session = require('koa-generic-session');
var redisStore = require('koa-redis');
app.keys = ['keys', 'c29tZSBzZWNyZXQgaHVycg'];
app.use(session({//配置session
    store: redisStore({}),
    cookie: {
        path: '/',
        httpOnly: true,
        maxAge: 1 * 60 * 60 * 1000,
        rewrite: true,
        signed: true
    }
}));
//====session e=====
router.get('/login', function* (next) {//登录页面 
    this.session=null;//删除cookie
    this.body=`
    <form action="/login" method="post">
        <p>用户名: <input type="text" name="name" /></p>
        <p>密码: <input type="text" name="pwd" /></p>
        <input type="submit" value="提交" />
    </form>   
    `;
}).post('/login', function* (next) {//提交登录数据 
    var sinfo = JSON.stringify(this.request.body);//<==获取post数据
    this.session.sinfo =sinfo;//<===存入session,模拟登录成功
    this.redirect('/');//<===跳转向到你要的页面
});

router.get('/', function* (next) {
    if(this.session&&this.session.sinfo){//判断是否有cookie
        this.body=`已登录 `;
    }else{
        this.redirect('/login');//<===跳转向到你要的页面    
    }
});

router.get('/sso.js', function* (next) { //动态js
    if(this.session&&this.session.sinfo&&this.session.sinfo.length>0){
        this.body=`var kosid='${this.sessionId}';`;//示例写入sessionId,也就是存入到redis的key
    }else{
         this.body=`window.location.href="http://sso.com/login";`;
    }
});

app.use(router.routes()).use(router.allowedMethods());
app.listen(8087);

应用代码示例:

const Koa = require('koa');
const Router = require('koa-router');
const bodyParser = require('koa-bodyparser');
const app = new Koa(); 
const router = new Router(); 
app.use(bodyParser());
//====session s=====可以直接用普通session 
app.keys = ['c29tZSBzZWNyZXQgaHVycg%3D%3D'];
var CONFIG = {
    key: 'koa:sess', /** (string) cookie key (default is koa:sess) */
    maxAge: 2000, /** (number) maxAge in ms (default is 1 days) */
    overwrite: true, /** (boolean) can overwrite or not (default true) */
    httpOnly: true, /** (boolean) httpOnly or not (default true) */
    signed: true, /** (boolean) signed or not (default true) */
};
app.use(session(CONFIG, app));
//====session e=====
/*
//====session s===== 或者一样吧
var session = require('koa-generic-session');
var redisStore = require('koa-redis');
app.keys = ['keys', 'c29tZSBzZWNyZXQgaHVycg'];
app.use(session({//配置session
    store: redisStore({}),
    cookie: {
        path: '/',
        httpOnly: true,
        maxAge: 1 * 60 * 60 * 1000,
        rewrite: true,
        signed: true
    }
}));
//====session e=====
*/

router.get('/', function* (next) {
     this.body=`
        <script type="text/javascript" src="http://cdn.bootcss.com/jquery/3.2.1/jquery.min.js"></script>
        <script type="text/javascript" src="http://cdn.bootcss.com/jquery-cookie/1.4.1/jquery.cookie.min.js"></script>
        <script src='http://sso.com:8087/sso.js'></script>
        <script>
            $.cookie("sid",kosid);
            if(kosid){
                document.write('key:',kosid);
            }else{
                document.write('未登录');                
            }
            console.log("this",document.cookie);
        </script>`;
    return;
});


app.use(router.routes()).use(router.allowedMethods());
app.listen(8088);

windows系统下修改hosts文件
(一般在C:\Windows\System32\drivers\etc下)
添加:

127.0.0.1 sso.com
127.0.0.1 testsso.com

浏览器访问:
http://sso.com:8087
http://testsso.com:8088

效果图片:

img_a330bececb79b4ab34a0679fc7997722.jpe
未登录
img_031c1214b50b08226a30c297dc310558.jpe
登录后
img_eb7bc263d715e1957bdfabcf1650abbd.jpe
应用获取到key
img_9894b8a2cdd83a613bfe91ca0398a856.jpe
redis实际数据

实际情况可能并不会这么简单,比如我们可以通过获取浏览器信息、时间戳、创建UUID等以URL传参方式结合cookie来判断登录用户合法性。等....

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值