什么是单点登录?下面本篇文章给大家给大家介绍一下单点登录原理, 聊聊使用Node实现单点登录SSO的方法, 希望对大家有所帮助!
文章插图
什么是单点登录【什么是单点登录?怎么使用Nodejs实现SSO】随着公司业务的增多, 必然会产生各个不同的系统, 如果每个系统都需要单独登录的话就会很不方便 。
因此产生了单点登录这样的解决方案,单点登录全称 Single Sign On, 简称SSO, 意思是在多个系统应用群中登录一个系统, 便可在其他所有系统中得到授权而无需再次登录 。
比如小明今天登录了淘宝, 如果没有登录, 就会被要求输入认证信息(用户名密码等), 登录过后再去访问天猫的页面时就不需要登录可以直接访问 。
单点登录原理
文章插图
SSO 需要有一个独立的认证中心, 只有独立的验证中心能接受用户的用户名密码等安全信息, 其他系统不提供登录入口, 只接受认证中心的间接授权 。
整个过程可以简单的用上图描述:
- 当用户登录访问应用A时, 应用A发现用户未登录,跳转至SSO认证中心, 并将自己的地址作为参数方便回调
SSO认证中心发现用户没有登录过, 将用户引导至登录页面;用户填写用户名密码提交登录申请;SSO认证中心校验用户信息, 创建用户雨SSO认证中心的会话(这时会把信息保存到cookie中), 同时创建授权令牌token
sso认证中心带着令牌跳转到最初的请求地址(应用A)
应用A拿到令牌去SSO认证中心认证是否有效, 如果返回有效注册应用A
应用A创建与用户之间的会话, 展示资源并维持用户登录态
当用户访问应用B时, 发现用户未登录(SSO认证服务器与应用A应用B不是同一个域,不能提供登录态), 跳转到SSO认证中心, 并将自己的地址和之前和SSO认证中心会话的cookie信息带入
SSO认证中心发现用户已登录, 跳转回应用B地址, 并附上令牌token
同样的应用B拿到令牌去SSO认证中心认证是否有效, 如果返回有效注册应用B
应用B创建与用户之间的会话, 展示资源并维持用户登录态
这里我们需要启动三个服务来分别模拟 应用A, SSO认证服务器和应用B
文章插图
这里端口号 8383的服务是SSO认证服务器, 其余的 :8686 和 :8787 分别代表应用A与应用B 。
其实应用A与应用B的代码几乎一样, 如上图所示我们可以通过穿参的方式来设置不同的端口及应用名 。
先来看下效果
文章插图
首次访问跳转至登录页
应用A判断登录态, 跳转到SSO认证服务器
应用A
const Koa=require('koa');const Router=require('koa-router')const views=require('koa-views')const static=require('koa-static')const path=require('path');const app=new Koa();const router=new Router();const session=require('koa-session')const koa2Req=require('koa2-request');//模版引擎相关配置app.use(views(path.join(__dirname,'./views')),{ extension:'ejs' })app.keys=['key']const keyMap={ '8686':'koa:sess8686', '8787':'koa:sess8787'}const CONFIG={ key:keyMap[process.env.PORT] || 'koa:sess', maxAge:1000*60*60*24, httpOnly:true}app.use(session(CONFIG,app))const system=process.env.SERVER_NAMErouter.get("/",async (ctx)=>{ //通过 session来判断 应用A的登录状态 let user=ctx.session.user if(user){ //... } else //1、当用户登录访问应用A时, 应用A发现用户未登录(应为服务器没有保存对应的session) { let token=ctx.query.token //第一次登录url上也不会有令牌 if(!token) { //1、跳转到SSO认证服务器 ctx.redirect(`http://localhost:8383/login?redirectUrl=${ctx.host+ctx.originalUrl}`) } else { //... } }})app.use(router.routes())const port=process.env.PORT||8888app.listen(port,()=>{ console.log(`app ${system} running at ${port}`)})认证服务器判断登录态, 渲染登录页
认证服务器SSO
认证服务器的目录结构如下
主要处理两个功能, 一是登录逻辑, 二是之后验证令牌的有效性, 分别有路由 login.js 和 check-token.js 处理
文章插图
推荐阅读
- 狐狸吊坠的寓意居然是这样的 狐狸吊坠代表什么
- 它的主要危害又是什么呢? 白色污染有哪些潜在的危害
- 生日最浪漫的表白词简单,美好梦想就是你
- 什么时候开始让宝宝学走路?
- 婴幼儿佝偻病因是缺维生素D
- 影响孩子身高8因素
- 宝宝什么时候学走路?
- 备孕直通车:出生季节影响身高 是否真实可信?
- 体重增长慢是病吗
- 地下城与勇士手游什么时候上线?DNF手游暑假上线时间介绍知道的都在这里了