zoukankan      html  css  js  c++  java
  • Express中设置cookie,session,token

    cookie

    Cookie是HTTP协议中请求头中的一个字段

    作用:验证用户是否登录

    Cookie是由服务器设置,由浏览器保存,cookie的内存空间是受到限制的,大约4kb

    登录原理

    HTTP协议是一个无状态的协议,理论上来说是无法保持登录的

    当用户填写完数据并且点击提交按钮的时候,此时浏览器会发送一个HTTP请求到服务器,服务器得到响应并经过验证之后,会在响应头中set-cookie字段中设置用户的信息,之后返回给前端,前端检测到set-cookie字段中的内容之后,会生成一个cookie文件,将用户的信息保存起来。当下一次用户向同一个服务器发送请求的时候,会将cookie文件中的内容携带到服务器中,经过服务器验证之后,就可以判断出使用是否登录过。

    例如:

    用户名张三,当通过表单填写完数据之后,发送HTTP请求到服务器,服务器经过验证用户信息无误的时候,会在响应头中的set-cookie字段中设置用户的信息: username=张三;password=123456,之后返回给前端,前端经过检测set-cookie中的内容之后,会生成cookie文件,将用户的信息保存起来,之后再次向同一个服务器发送请求的时候,会将cookie文件中的内容带到服务器中,服务器经过验证之后,就可以判断出用户是否登录

    设置cookie

    使用方式:res.cookie(key, value, options)

      key: 数据名称

      value: 设置的数据

      options: 配置项

    获取cookie

    想要获取cookie中的内容 必须借助中间件cookie-parser,引入中间件后通过app.use()安装,安装cookie一定要在安装路由对象之前,否则获取的值为undefined

    通过req.cookies对象获取

    浏览器端获取cookie数据,通过document.cookie属性获取

     

    session

    Session是服务器上的一段内存空间,也是用于存储数据。但是Session依赖于Cookie

    cookie将信息存储在客户端,有大小限制;session将信息存储在服务器端,大小取决于服务器的大小。

    Session是服务器上的一段内存空间,通常是保存一些重要的信息,一些不重要的信息保存在cookie中就好。

    登录原理:

    当用户通过表单或者是ajax发送请求的时候,浏览器会发出一个HTTP请求到服务器,服务器得到响应并开始处理,之后返回一个随机字符(也叫作密钥),该字符串对于浏览器来说没有什么作用, 但是对于服务器来说,可以通过该随机字符串识别用户的信息,之后返回数据给前端,并在响应头的set-cookie中设置用户的信息(随机字符串)。之后,浏览器检测cookie字段中的内容,会生成一个cookie文件,当再次向同一个服务器发送请求的时候,则会将cookie中的内容(随机字符串)携带到服务器中,然后经过服务器处理之后,就可以判断用户是否登录过

    设置session

    在Express中可以通过req.session用于设置以及获取session

    当想要获取session中的内容时,需要借助中间件 express-session

    并且要进行配置:

    app.use(expressSession({

      secret: 配置密钥

      resave: 每一次访问session时,是否重置,布尔值

      saveUninitialized: 在初始化时是否设置session,布尔值

    }))

    token

    含义:凭证、令牌。是由服务器自定义加密的一种手段

    生成:由后端生成 存储:存储在前端的cookie中或者本地存储中

    格式:头部,数据,签名

    作用:验证用户身份

    流程机制:客户端使用用户名跟密码发送登录请求。服务端收到请求,去验证用户名与密码

    验证成功后,服务端会生成一个 Token字符串,再把这个 Token字符串发送给客户端,服务器端不会保留该Token字符串。

    客户端收到 Token字符串,可以把它存储起来,比如放在 Cookie 里或者 Local Storage 里。客户端每次向服务端请求资源的时候需要带着服务端签发的 Token字符串。

    服务端收到请求,然后去验证客户端请求里面带着的 Token,如果验证成功,响应本次请求,如果验证失败则服务器可以拒绝

    token 特点:

    服务器无状态:因为服务器只负责解密而不负责存储

    把所有状态信息都附加在 Token 上,服务器就可以不保存。但是服务端仍然需要认证 Token 有效。

    只要服务端能确认是自己签发的 Token,而且其信息未被改动过,那就可以认为 Token 有效。“签名”就是做这个的。

    Token 是在服务端产生的,如果前端使用用户名/密码向服务端请求认证,服务端认证成功,那么在服务端会返回 Token 给前端。

    前端可以在每次请求的时候带上 Token 证明自己的合法地位。如果这个 Token 在服务端持久化(比如存入数据库),那它就是一个永久的身份令牌。

    JWT标准:

    因为这个过程的验证并不是HTTP协议中规定的方式,而是自定义的。所以很可能每个公司就有自己的使用方式。所以,就出现了标准。

    标准的 Token 有三个部分:

    header(头部)

    payload(数据):iss:Issuer,发行者;sub:Subject,主题;aud:Audience,观众;exp:Expiration time,过期时间;nbf:Not before;iat:Issued at,发行时间;jti:JWT ID

    signature(签名):header,payload,secret

    使用步骤

      1 引入jwt(jsonwebtoken)模块

      2 定义指定加密字符串

      3 当用户登录成功之后,通过jwt提供了sign方法。可以将用户的信息以及加密字符串捆绑到一起生成token字符串

      4 将用户的信息返回给前端,前端可以将token字符串保存在本地存储中

      5 当前端再次发送请求的时候,将token字符串携带到服务器中

      6 经过jwt提供的verify方法进行解密。之后返回给前端

     

    sign方法:

      jwt.sign(req.body, secret)

        req.body: 用户名和密码信息(客户端提交的)

        secret: 创建的秘钥

    verify方法:

      jwt.verify(req.query.token, secret, (err, result) => {})

        req.query.token: sign方法创建的token数据

        secret:sign方法创建的秘钥

        回调函数中的参数:

          err:错误信息(如果为null则证明成功)

          result:返回用户名和密码(客户端提交的数据)

     

    服务器端代码:

     前端index首页登录成功后,获取服务器端携带的token并存储在localStorage中,并跳转到demo页面去验证:

    demo页面获取存储在localStorage中的token,向后端发送携带token的请求

  • 相关阅读:
    虚函数与动态多态
    我读苏东坡
    Linux高性能服务器编程学习-第三章思维导图笔记
    Linux高性能服务器编程学习-第二章思维导图笔记
    Linux高性能服务器编程学习-第一章思维导图笔记
    【Knockout】五、创建自定义绑定
    【Knockout】三、data-bind声明式绑定
    【Knockout】四、绑定上下文
    【Knockout】一、认识Knockout,你会爱上它
    【Knockout】二、监控属性Observables
  • 原文地址:https://www.cnblogs.com/yess/p/14766374.html
Copyright © 2011-2022 走看看