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

Auth/service/index.js
module.exports={ isTokenVailid: function(token){ if(token && token==='passport'){ return true } return false }}至此用户已经能正常访问应用A, SSO服务器和应用A服务器上都有了用户登录过的信息 。
访问应用B
带cookie跳转至SSO认证服务器
应用B
//...router.get("/",async (ctx)=>{ let user=ctx.session.user if(user){ //... }else{ let token=ctx.query.token //... if(!token) { //同样既没有session也没有令牌, 跳转到SSO认证服务器 //6、当用户访问应用B时, 发现用户未登录(SSO认证服务器与应用A应用B不是同一个域,不能提供登录态), 跳转到SSO认证中心, 并将自己的地址和之前和SSO认证中心会话的cookie信息带入 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}`)})从认证服务器携带令牌跳转回应用B
SSO认证服务器 ,再次登录时携带了cookie, 因此不会再请求登录页面
Auth/routes/login
//...router.get('/',async (ctx)=>{ const cookies=ctx.cookies; const token=cookies.get('token'); //7. SSO认证中心发现用户已登录, 跳转回应用B地址, 并附上令牌token if(token && service.isTokenVailid(token)){ const redirectUrl=ctx.query.redirectUrl; if(redirectUrl){ //带着令牌跳转回应用B ctx.redirect(`${ctx.protocol}://${redirectUrl}?token=${token}`) }else{ ctx.body="<h1>登录成功!</h1>" } }else{ //...渲染登录页面 }})//..令牌校验 返回资源
这里的逻辑和5, 6两步一样, 因为token容易伪造, 所以要检验真伪 。
应用B
app.use(views(path.join(__dirname,'./views')),{ extension:'ejs' })//...const system=process.env.SERVER_NAMErouter.get("/",async (ctx)=>{ let user=ctx.session.user if(user){ //... } else //这时应用B依旧没有登录态 但url上有了令牌 http://localhost:8787/?token=passport { let token=ctx.query.token if(!token) { //...跳转去SSO登录页面 } else //跳回应用B时走这里的逻辑 { //ajax请求 8. 同样的应用B拿到令牌去SSO认证中心认证是否有效, 如果返回有效注册应用B const url=`://localhost:8383/check_token?token=${token}&t=${new Date().getTime()}` let data = https://www.52zixue.com/zhanzhang/webqd/js/04/23/70557/await koa2Req(ctx.protocol + url); if(data && data.body){ try { const body=JSON.parse(data.body) const {error,userId}=body; // console.log(error,userId) 0,admin if(error==0){ if(!userId){ ctx.redirect(`http://localhost:8383/login?redirectUrl=${ctx.host+ctx.originalUrl}`) return } //验证通过后注册session, 渲染页面 //9. 应用B创建与用户之间的会话, 展示资源并维持用户登录态 ctx.session.user=userId; await ctx.render('index.ejs',{ user:userId, system }) }else{ ctx.redirect(`http://localhost:8383/login?redirectUrl=${ctx.host+ctx.originalUrl}`) } } catch (error) {console.log(error)} } } }})app.use(router.routes())const port=process.env.PORT||8888app.listen(port,()=>{ console.log(`app ${system} running at ${port}`)})至此单点登录的大部分逻辑都已经完成, 之后再session有效期内再访问页面, 就不需要再登录, 直接返回资源
router.get("/",async (ctx)=>{//如果session中有用户信息, 说明已经登录过, 直接返回请求资源 let user=ctx.session.user if(user){ await ctx.render('index.ejs',{ user, system }) } //... })

原文地址:https://juejin.cn/post/7088343138905325582
作者:YoYo君
更多node相关知识, 请访问:nodejs 教程!
以上就是什么是单点登录?怎么使用Nodejs实现SSO的详细内容, 更多请关注电脑自学网其它相关文章!

推荐阅读