什么是單點登錄?怎么使用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的詳細內容, 更多請關注電腦自學網其它相關文章!

推薦閱讀