什么是单点登录?怎么使用Nodejs实现SSO

什么是单点登录?下面本篇文章给大家给大家介绍一下单点登录原理, 聊聊使用Node实现单点登录SSO的方法, 希望对大家有所帮助!

什么是单点登录?怎么使用Nodejs实现SSO

文章插图

什么是单点登录【什么是单点登录?怎么使用Nodejs实现SSO】随着公司业务的增多, 必然会产生各个不同的系统, 如果每个系统都需要单独登录的话就会很不方便 。
因此产生了单点登录这样的解决方案,单点登录全称 Single Sign On, 简称SSO, 意思是在多个系统应用群中登录一个系统, 便可在其他所有系统中得到授权而无需再次登录 。
比如小明今天登录了淘宝, 如果没有登录, 就会被要求输入认证信息(用户名密码等), 登录过后再去访问天猫的页面时就不需要登录可以直接访问 。
单点登录原理
什么是单点登录?怎么使用Nodejs实现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创建与用户之间的会话, 展示资源并维持用户登录态
NodeJS 演示三个不同的服务
这里我们需要启动三个服务来分别模拟 应用A, SSO认证服务器和应用B
什么是单点登录?怎么使用Nodejs实现SSO

文章插图

这里端口号 8383的服务是SSO认证服务器, 其余的 :8686 和 :8787 分别代表应用A与应用B 。
其实应用A与应用B的代码几乎一样, 如上图所示我们可以通过穿参的方式来设置不同的端口及应用名 。
先来看下效果
什么是单点登录?怎么使用Nodejs实现SSO

文章插图

首次访问跳转至登录页
应用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 处理
什么是单点登录?怎么使用Nodejs实现SSO

文章插图

推荐阅读