nodejs通过jsonp实现单点登录Demo

本文涉及的产品
云数据库 Redis 版,社区版 2GB
推荐场景:
搭建游戏排行榜
简介: 说明:使用redis作为session的存储方式使用引入sso服务器中的动态js地址来获取cookie应用服务器获取单点服务器提供的特殊标识比如sessionId或其他后,通过标识直接去往redis中去查询,或是提交(通过rpc)给单点服务器去...

说明:使用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来判断登录用户合法性。等....

相关实践学习
基于Redis实现在线游戏积分排行榜
本场景将介绍如何基于Redis数据库实现在线游戏中的游戏玩家积分排行榜功能。
云数据库 Redis 版使用教程
云数据库Redis版是兼容Redis协议标准的、提供持久化的内存数据库服务,基于高可靠双机热备架构及可无缝扩展的集群架构,满足高读写性能场景及容量需弹性变配的业务需求。 产品详情:https://www.aliyun.com/product/kvstore &nbsp; &nbsp; ------------------------------------------------------------------------- 阿里云数据库体验:数据库上云实战 开发者云会免费提供一台带自建MySQL的源数据库&nbsp;ECS 实例和一台目标数据库&nbsp;RDS实例。跟着指引,您可以一步步实现将ECS自建数据库迁移到目标数据库RDS。 点击下方链接,领取免费ECS&amp;RDS资源,30分钟完成数据库上云实战!https://developer.aliyun.com/adc/scenario/51eefbd1894e42f6bb9acacadd3f9121?spm=a2c6h.13788135.J_3257954370.9.4ba85f24utseFl
相关文章
|
6月前
|
JavaScript 前端开发 Python
Node.js在Python中的应用实例demo
Node.js在Python中的应用实例demo
|
4月前
|
JavaScript
【Node学习】—运行node服务demo
【Node学习】—运行node服务demo
|
中间件
nodeJS+express+mysql模块封装之服务器渲染小demo
nodeJS+express+mysql模块封装之服务器渲染小demo
nodeJS+express+mysql模块封装之服务器渲染小demo
|
消息中间件 监控 JavaScript
阿里云AMQP NodeJS SDK使用Demo
消息队列RabbitMQ版是阿里云消息队列(MQ)团队基于AMQP 0-9-1(AMQP 0.91)标准协议研发的分布式、高吞吐、低延迟、高可扩展的云消息队列服务。消息队列RabbitMQ版完全兼容开源RabbitMQ社区、开箱即用、无需部署、免运维,帮助您快速上云。阿里云提供全托管服务,更专业、更可靠、更安全。本文主要演示如何使用开源NodeJS SDK连接阿里云AMQP 消息服务,实现消息收发。
911 0
阿里云AMQP NodeJS SDK使用Demo
|
消息中间件 JavaScript 物联网
阿里云物联网平台AMQP服务端订阅NodeJS Demo
服务端可以直接订阅产品下所有类型的消息:设备上报消息、设备状态变化通知、网关发现子设备上报、设备生命周期变更、设备拓扑关系变更。配置服务端订阅后,物联网平台会将产品下所有设备的已订阅类型的消息转发至您的服务端。本文主要演示如果使用NodeJs SDK进行AMQP服务端订阅
594 0
阿里云物联网平台AMQP服务端订阅NodeJS Demo
|
自然语言处理 JavaScript
阿里云机器翻译NodeJS使用Demo
阿里巴巴机器翻译是由阿里巴巴匠心打造的在线智能机器翻译服务。依托领先的自然语言处理技术和海量的互联网数据优势,阿里巴巴成功上线基于注意力机制的深层神经网络翻译系统(NMT),帮助用户跨越语言鸿沟,畅享交流和获取信息,实现无障碍沟通。凭借海量数据积累及关键技术创新,在电商领域翻译质量独具优势。下面介绍如何使用NodeJS SDK调用阿里云机器翻译API。
462 0
阿里云机器翻译NodeJS使用Demo
|
存储 数据库 数据库连接
|
数据库 数据库连接 存储
|
2月前
|
Web App开发 缓存 JavaScript
【安装指南】nodejs下载、安装与配置详细教程
这篇博文详细介绍了 Node.js 的下载、安装与配置过程,为初学者提供了清晰的指南。读者通过该教程可以轻松完成 Node.js 的安装,了解相关配置和基本操作。文章首先介绍了 Node.js 的背景和应用场景,随后详细说明了下载安装包、安装步骤以及配置环境变量的方法。作者用简洁明了的语言,配以步骤图示,使得读者能够轻松跟随教程完成操作。总的来说,这篇文章为初学者提供了一个友好的入门指南,使他们能够顺利开始使用 Node.js 进行开发。
204 1
【安装指南】nodejs下载、安装与配置详细教程
|
2月前
|
消息中间件 Web App开发 JavaScript
Node.js【简介、安装、运行 Node.js 脚本、事件循环、ES6 作业队列、Buffer(缓冲区)、Stream(流)】(一)-全面详解(学习总结---从入门到深化)
Node.js【简介、安装、运行 Node.js 脚本、事件循环、ES6 作业队列、Buffer(缓冲区)、Stream(流)】(一)-全面详解(学习总结---从入门到深化)
77 0