网站建设的部署,研发项目备案在哪个网站做,淄博seo网站排名优化,国外 家具 网站模板应用场景#xff1a;访问某些页面#xff0c;需要用户进行登录#xff0c;那我们如何知道用户有没有登录呢#xff0c;这时我们就可以使用jwt技术。用户输入的账号和密码正确的情况下#xff0c;后端根据用户的唯一id生成一个独一无二的token#xff0c;并返回给前端访问某些页面需要用户进行登录那我们如何知道用户有没有登录呢这时我们就可以使用jwt技术。用户输入的账号和密码正确的情况下后端根据用户的唯一id生成一个独一无二的token并返回给前端前端把token保存起来每次发送请求请求头携带一个token以表示用户的身份。当然后端也要进行校验确保用户的token不是伪造和过期的。 下面举个例子使用node搭建服务器来详细说明 jwt 的具体用法。
1.用户通过提供身份信息如账号和密码进行身份验证 2.服务器验证用户提供的身份信息如果验证通过则并生成一个token并返回给客户端
if (req.query[username] req.query[password]) {const { password, username } req.query;// 1. 根据用户名查找用户const user await Admin.findOne({ username }).select(password);// 如果用户名没找到if (!user) return resp.send({ code: 422, message: 用户不存在 });// 2. 校验密码比较明文和密文的密码const isTrue require(bcryptjs).compareSync(password, user.password);// 如果密码错误则抛出错误状态码和错误信息if (!isTrue) return resp.send({ code: 422, message: 密码错误 });// 3. 返回token值利用公钥加密用户的唯一id得到token值并且设置了过期时间为2小时const token jwt.sign({ id: user._id }, app.SECRET, { expiresIn: 2h });// 查找用户信息const userInfo await Admin.find({ username: req.query.username }).sort({timeStamp: -1,});// 成功生成 JWT将 JWT 返回给客户端resp.setHeader(Access-Control-Allow-Origin, *);resp.setHeader(Access-Control-Expose-Headers, Authorization);resp.setHeader(Authorization, Bearer ${token});return resp.send({ token, code: 200, userInfo });}3.客户端将 token 保存到本地中
//设置响应拦截器instance.interceptors.response.use((res) {if (res.headers.authorization) { const token res.headers.authorization.split( )[1]console.log(token,token);localStorage.setItem(token,token)}// 拦截后需要将拦截下来处理成的结果返回return res.data;},(err) {console.log(err);});4.在后续请求中将 token 放在请求的头部以表示用户的身份
// 请求拦截器instance.interceptors.request.use((config) {// 将token拿出来拼接到请求头上const token localStorage.getItem(token);if (token) {config.headers.Authorization Bearer ${jwt};}//请求成功的函数return config;},(err) {return err;});5.服务器在接收到请求时验证 token 的有效性并根据其中的信息进行授权和验证。
// 判断用户token是否合法router.get(/verify, async (req, resp) {const { token } req.query;console.log(token);**// 如果token是伪造的则直接抛出异常try {const obj jwt.verify(token, app.SECRET);console.log(obj);// obj.exp 是过期的时间单位为sif (Date.now() obj.exp * 1000) {resp.send({ code: 401, message: 无效的JWT令牌 });} else { resp.send({ code: 200, message: success });}} catch (error) {resp.send({ code: 401, message: 无效的JWT令牌 });}});