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('身份认证失败!') // 未知错误...
})