用户信息认证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(签名)进行解密。

 

 

posted @ 2018-11-15 20:36  如常  阅读(1953)  评论(0编辑  收藏  举报