浅谈JWT用户信息认证解决方案

登录看似是一个简单的功能,实际上随着业务的增多和项目的扩大,早期的 JSP、ASP、PHP 时代,常用的解决方案只是服务端写一个 session 就搞定了,前端调用登录接口即可。但现在更多考虑到单点登录、身份加密、OAuth 授权等安全场景。

SessionID

http 本身是无状态协议,服务端和前端通信是相互不认识的,为了能记住每个访问的身份,引入了 Session 概念,他是一种服务端缓存技术。当用户访问服务端时候,服务端会生成一个 SessionId 作为唯一标识保存在内存中,并写入用户浏览器的 cookie 中,当用户下次访问时,会携带这个 cookie,服务端根据据 SessionId 来判断用户身份。

Cookie 是前端浏览器的特性。跟 Session 有相似之处,但一般我们都不用 Session 作为唯一身份。当用户登录以后,服务端会一个 UserId 作为用户的唯一值,前端获取登录信息后,可自行写入 cookie 或者有服务端写入 Cookie,下次访问页面时,可根据 Cookie 信息来识别用户身份,的但是这种 Cookie 方式不安全

JWT

JWT 是一种综合技术方案,即能安全保证,又能简单使用,同时具备时效性。是目前主要的技术方案

OAtuh

OAtuh 本身是一种单点登录协议,当存在多个业务系统时,又不能每套系统都有一个独立的登录功能,就要借助 OAtuh 做登录授权,一次登录可访问全部系统,最常见的为第三方登录如微信、qq 授权登录等。


本章重点介绍 JWT 的用法和基本概念

什么是 JWT

JWT 是一种跨域认证解决方案,会利用加密和组合生成 JWT TOKEN,对数据传输具有较高的安全性、时效性,可以利用集群做好单点登录

业务流程

在登录时,前端向服务端发送登录认证,认证通过服务端返回用户基本信息和 token 签名,前端对 token 做数据持久化后,在后面所有的业务接口时都在 header 中添加 token 发送给服务端, 服务端会每次验证 token 的时效性,并正常传输数据,否则返回过期信息,前端自动重定向到登录页提示用户重新登录。

在 Koa 项目中使用 JWT

npm install jsonwebtoken -S // 用于生成token签名
npm install koa-jwt -S // 用于验证token时效性

生成 token,在路由模块中使用

const router = require("koa-router")()
const jwt = require("jsonwebtoken")
router.post("/login", async (ctx)=>{
   const {userName,userPwd} = ctx.request.body
   const res = await User.findOne({userName,userPwd})
   const token = jwt.sign({
     data:res._doc,
  },"xxxs",{expiresIn:10})
   console.log(token) //打印token 签证
})
/*
* jwt.sign({签证的内容},"加密方式,可以为xxx",{加密时常:10秒 '10h'小时 '10d'天})
*/

解密 token 数据,在同上路由模块中

router.get("/demo",async (ctx)=>{
  jwt.verify(ctx.header.authorization,"xxx",(error,authData)=>{
if(err){
        console.log(err)  
        }else{
            console.log(authData)
        }        
        /**
        * error 报错信息
        * authData 解析出来的token数据
        */
    })
})

添加 jWT 拦截器, app.js 中添加

const koajwt = require('koa-jwt')
app.use(async (ctx,next)=>{
   await next().catch((err)=>{
   if(err.status == "401"){ // koajwt中认证失败默认会返回401状态吗
     ctx.status = 200
     ctx.body = {msg:"token认证失败"}
  }else{
     throw err
  }
})
})
app.use(koajwt({secret:'xxx'}).unless({
 path:[/^\/users\/login/] // 这里是跳过拦截的路由,原则上登录接口是没有token的
}))

前端请求方式

import axios from "axios"
axios({
   method:"post",
   url:'/demo',
   headers:{
       Authorization: "Bearer "+token
  }
}).then((response)=>{
   console.log(response)
})
暂无评论

发送评论 编辑评论


				
|´・ω・)ノ
ヾ(≧∇≦*)ゝ
(☆ω☆)
(╯‵□′)╯︵┴─┴
 ̄﹃ ̄
(/ω\)
∠( ᐛ 」∠)_
(๑•̀ㅁ•́ฅ)
→_→
୧(๑•̀⌄•́๑)૭
٩(ˊᗜˋ*)و
(ノ°ο°)ノ
(´இ皿இ`)
⌇●﹏●⌇
(ฅ´ω`ฅ)
(╯°A°)╯︵○○○
φ( ̄∇ ̄o)
ヾ(´・ ・`。)ノ"
( ง ᵒ̌皿ᵒ̌)ง⁼³₌₃
(ó﹏ò。)
Σ(っ °Д °;)っ
( ,,´・ω・)ノ"(´っω・`。)
╮(╯▽╰)╭
o(*////▽////*)q
>﹏<
( ๑´•ω•) "(ㆆᴗㆆ)
😂
😀
😅
😊
🙂
🙃
😌
😍
😘
😜
😝
😏
😒
🙄
😳
😡
😔
😫
😱
😭
💩
👻
🙌
🖕
👍
👫
👬
👭
🌚
🌝
🙈
💊
😶
🙏
🍦
🍉
😣
Source: github.com/k4yt3x/flowerhd
颜文字
Emoji
小恐龙
花!
上一篇
下一篇