'令牌'的意思,是一个字符串,在客户端第一次请求服务器时由服务器生成,然后响应给客户端(保存),当客户端再次请求服务器时,带上token,就不需要再带用户名和密码
(1)防止表单重复提交:在表单中加入隐藏的表单控件,在这个隐藏的表单控件中带上token字符串
(2)进行身份验证:
a、为什么要进行身份认证:基于http协议的请求,无状态(当客户端与服务器之间的请求-响应过程完成后,客户端和服务器就断开了联系、服务器无法记录或跟踪客户端)。当客户端再次向服务器发起请求的时候,服务器需要对客户端的身份进行认证。
b、传统的身份认证方式:
cookie:在服务器端生成,保存在客户端。
session:在服务器端生成,保存在服务器端
c、token认证:在服务器端不需要保存用户的身份信息,流程如下:
1.客户端使用用户名和密码请求登录。
2. 服务端收到请求,验证用户名和密码。
3.验证成功后,服务端会生成一个令牌,然后把这个令牌发送给客户端。
4. 客户端收到令牌后把它存储起来,可以放在cookie或者Local Storage(本地存储)里。
5.客户端每次向服务端发送请求的时候都需要带上服务端发给的令牌。
6.服务端收到请求,然后去验证客户端请求里面带着令牌,如果验证成功,就向客户端返回请求的数据。
d、token的本质:是对用户的信息进行加密、解密,因此保存在客户端的token是加密后的一个字符串
(1)node项目使用JWT模块,实现token认证
JWT:JsonWebToken,是一种身份认证和授权的方案,即客户端向服务器发送请求时,在请求信息中携带token,服务器端接收到请求信息后,对token进行验证,若验证通过则向客户端响应数据。
(2)JWT中的函数:
a、sign(payload, secretOrPrivateKey, [options, callback]):返回值一个字符串(即加密后的字符串)
payload:需要加密的内容
secretOrPrivateKey:加密字符串或密钥文件
选项:其他参数
expiresIn:有效时间 // 如 '6h' 、'1d'
b、verify(token, secretOrPublicKey, [options, callback]):返回值是逻辑值(true/false),验证token,token字符串一样、密钥也必须一致
token:token字符串
secretOrPublicKey:加密时用的密钥
选项:是参数列表
c、decode(token [, options]):解密方法,返回的是明文
token:token字符串
options:是一个逻辑值(true/false)。是否以同步方式解码
(3)创建Express项目:
a、安装JWT对应的模块:jsonwebtoken
b、创建接口文件:
--第一次向服务器发起登录请求时,没有token信息
--当用户登录后,在服务器端生成token,token中包含那些信息由用户决定,然后将token响应给客户端
--当客户端接收到服务器端相应的token后,将token存入本地的缓存(localStorage)中
--当客户端再次访问服务器时,需要在请求头中包含token;服务器端在接收到客户端的请求后,先查找客户端的请求头中是否有token,若没有则表明该用户是非法用户,不响应任何数据;若有token,则表明该用户是合法用户,就响应数据
--安装、导入jsonwebtoken模块
--在登录接口时生成token并返回给客户端
--在客户端接收到的token保存到本地缓存
--当客户端再次访问(包括非法访问)服务器,服务器端会对token进行验证
--客户端每次向服务器发起请求时都必须携带token,否则视为非法用户
1、百度开发者的账户申请
2、申请AK密钥
(1)一对一的关系:例如 身份证和居民之间的关系。用一张表就可以表示
(2)一对多的关系:例如 班级和学生之间的关系。一端不动,多端增加一列用来关联一端
(3)多对多的关系:例如 学生和课程之间的关系。生成第三张表