Express框架开发接口之JWT鉴权机制

1. 什么是身份认证

身份认证(Authentication)又称“身份验证”、“鉴权”,是指通过一定的手段,完成对用户身份的确认。

⚫ 日常生活中的身份认证随处可见,例如:高铁的验票乘车,手机的密码或指纹解锁,支付宝或微信的支付密码等。

⚫ 在 Web 开发中,也涉及到用户身份的认证,例如:各大网站的手机验证码登录、邮箱密码登录、二维码登录等。

2不同开发模式下的身份认证

对于服务端渲染和前后端分离这两种开发模式来说,分别有着不同的身份认证方案:

① 服务端渲染推荐使用 Session 认证机制

② 前后端分离推荐使用 JWT 认证机制

2. 什么是 JWT

JWT(英文全称:JSON Web Token)是目前最流行的跨域认证解决方案。

JWT 的工作原理

总结:用户的信息通过 Token 字符串的形式,保存在客户端浏览器中。服务器通过还原 Token 字符串的形式来认证用户的身份。

JWT 的组成部分

JWT 通常由三部分组成,分别是 Header(头部)、Payload(有效荷载)、Signature(签名)。 三者之间使用英文的“.”分隔,格式如下:

下面是 JWT 字符串的示例:

JWT 的三个部分各自代表的含义

JWT 的三个组成部分,从前到后分别是 Header、Payload、Signature。 其中:

⚫ Payload 部分才是真正的用户信息,它是用户信息经过加密之后生成的字符串。

⚫ Header 和 Signature 是安全性相关的部分,只是为了保证 Token 的安全性。

JWT 的使用方式

客户端收到服务器返回的 JWT 之后,通常会将它储存在 localStorage 或 sessionStorage 中。 此后,客户端每次与服务器通信,都要带上这个 JWT 的字符串,从而进行身份认证。推荐的做法是把 JWT 放在 HTTP 请求头的 Authorization 字段中,格式如下:

3. token

token 是什么

token是服务端生成并返回给 HTTP 客户端的一串加密字符串, token中保存着 用户信息

token 的作用

实现会话控制,可以识别用户的身份,主要用于移动端 APP

客户端每次在访问那些有权限接口的时候,都需要主动通过请求头中的 Authorization 字段,将 Token 字符串发 送到服务器进行身份认证。

4. 如何实现?

借助第三方库 jsonwebtoken,通过jsonwebtoken的sign方法生成一个token

npm i jsonwebtoken

创建config.js文件,并向外共享加密和还原 Token 的jwtSecretKey字符串:

module.exports= {  jwtSecretKey: 'itheima No1. ^_^', } 
// 生成 Token 字符串 
consttokenStr=jwt.sign(user, config.jwtSecretKey, {  expiresIn: '10h', // token 有效期为 10 个小时 
})

第一个参数指的是Payload

第二个是秘钥

第三个参数是option,可以定义token过期时间

校验token

配置解析 Token 的中间件

npm i express-jwt

在app.js中注册路由之前,配置解析 Token 的中间件:

// 导入配置文件

const config = require('./config')

// 解析 token 的中间件

const expressJWT = require('express-jwt')

// 使用 .unless({ path: [/^\/api\//] }) 指定哪些接口不需要进行 Token 的身份认证

app.use(expressJWT({ secret: config.jwtSecretKey }).unless({ path: [/^\/api\//] 
}))

secret必须和sign时候保持一致,通过unless配置接口白名单 指定哪些接口不需要进行 Token 的身份认证

在app.js中的错误级别中间件里面,捕获并处理 Token 认证失败后的错误:

// 错误中间件 
app.use(function (err, req, res, next) {  // 省略其它代码... 
  // 捕获身份认证失败的错误 
  if (err.name==='UnauthorizedError') returnres.cc('身份认证失败!')  // 未知错误... 
})
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值