zoukankan      html  css  js  c++  java
  • 用户信息认证session和token

    在进行用户信息认证之前,我们需要先知道两个知识点:

    (1):http是无状态协议。所以,在进行信息认证时,我们需要引入状态机制,也就是session机制。

    (2):cookie,与域名有关,域名不变,cookie不变。也就是说,在同一域名下,请求各种资源都会携带cookie回后端。

    下面来谈谈两种认证方式:

    1.session(会话)

    这种方式依赖于cookie,我们也称它为setCookie(种cookie)。

    原理:当前端发出一次请求时,后端产生一个session ID,后端自动通过response返还给前端,也就是setCookie,用户请求第二个页面时,浏览器自动通过request携带cookie到后端进行比较。

    以下步骤为操作过程:

    • 安装express-session(yarn add express-session)

    • 配置session,一定要在路由之前配置。

      // session 配置,配置在路由之前
      app.use(session({
        secret: 'keyboard cat',
        resave: false,
        saveUninitialized: false,
        cookie: {
          httpOnly: true, 
          secure: false,
          maxAge: 24 * 60 * 60 * 1000
        }
      }))

    • 引入express-session后就直接有了session对象

    扩展:

    由此引出一个新的问题:登录不过期时,用户关闭浏览器再次打开,首页面依然保持登录状态。如何判断用户是否登陆过?以下提供两种解决方案:​

    第一种:通过判断cookie(sessionID)是否存在。缺点:sessionID不携带用户信息。

    第二种:再次请求后端API,判断req.session.username是否存在,返回给前端一个信息。
    2. 生成token(基于jwt(jsonwebtoken)的认证机制)

    (1)生成token

    方法一:对称加密:SH256
    方法二:非对称加密:RS256,私钥加密,公钥解密。(github的传输就是采用非对称加密)

    (2)后端向前端传输数据的方式有四种:

    • get(在queryString中显示)

    • post(FormData中显示)

    • 通过自定义路由载荷一个对象

    • 设置响应头res.header

      要注意最后一种传输方式,前端接收时,如果采用jquery中ajax的success:(data,status,xhr)=>{}中的方法来获取response的头部信息会有坑,最好使用.then()方法。

    (3)传递到前端,利用localstorage.setItem()存储token。token并不存储在服务器端,所以删除的时候要记得,从哪里存储,就在哪里删除。

    (4)用户发起请求时,前端要想后端传递token,可使用jquery中$.ajax中的header配置。后端用req.header()取出token,进行验证,利用cert(签名)进行解密。

     

  • 相关阅读:
    Medium | LeetCode 11. 盛最多水的容器 | 双指针
    Hard | LeetCode 41. 缺失的第一个正数 | 原地Hash
    Navicat Premium 15 使用注册机破解,附带Navicat Premium 15安装包、注册机下载
    vue $forceUpdate() 强制重新渲染
    js 原生录制屏幕
    mysql 8.0.17 解压版安装教程
    vue 移动端适配 amfe-flexibl
    mysql重置密码
    2059-Authentication plugin'caching_sha2_password'cannot be loaded
    用js实现时间减去前1小时、7天、1月、1年
  • 原文地址:https://www.cnblogs.com/ruchang/p/9965919.html
Copyright © 2011-2022 走看看