session 和 token

您需要高效学习,找工作? 点击这里 白月黑羽实战班

点击这里,边看视频讲解,边学习以下内容

前面我们已经根据接口文档,编写代码, 对前端发来的 Customer API请求进行处理了。

并且我们也编写了 用户登录处理的代码。

不知道大家有没有发现一个问题?

前端发来的 Customer API 请求, 我们后端代码就直接处理了, 并没有验证 这个请求是不是已经登录的管理员发出的。

如果是这样,客户端可以不需要登录,直接访问 登录后的主页, 我们编写的登录处理代码又 有什么用呢?

这就 需要我们在 处理 Customer API 请求前, 判断发出该请求的用户是否登录了。

对于请求消息的合法性验证, 通常有两种方案: sessiontoken

session 方案


点击这里,边看视频讲解,边学习以下内容

session 就是 会话 的意思。

session 方案 的原理如下:



token机制

使用session机制验证用户请求的合法性 的主要缺点有两个

最近比较流行的一种token机制可以比较好的解决这些问题。

token 简单来说,就是包含了 数据信息 和 校验信息的 数据包。

Session 机制是把 数据信息(比如session表)放到 服务端,服务端数据是客户无法篡改的,从而保证验证的 可靠性。

而 token机制 数据信息 直接传给 客户端,客户每次请求再携带过来给服务端。服务端无需查找数据库,直接根据token里面的数据信息进行校验。

那么问题来了:客户数据直接发送给客户端,如果 客户端篡改了数据, 比如把自己改为 vip用户怎么办? 服务端怎么验证数据有没有被客户端篡改(术语叫完整性验证)呢?



token 机制的原理如下:




使用session验证客户端请求


点击这里,边看视频讲解,边学习以下内容

Django 对session 的支持是 缺省就有的,下面我们来看看如何加入对API请求的合法性验证。

大家是否注意到,前面我们处理登录的函数中 有如下箭头所指的 一行代码

这行代码的作用 就是在登录认证后,将 用户类型保存到session数据中, 也就是存入前面数据库的那张图的 会话数据记录中。

Django 框架 会自动在 HTTP 响应消息头中 加入 类似下面的 sessionid cookie

   Set-Cookie: sessionid=????????

后续的HTTP请求就会携带这个sessionid,

我们处理 URL 以 /api/mgr 开头的 API 请求 代码里面, 需要 加上一个验证逻辑。

验证请求的cookie里面是否有sessionid,并且检查session表,看看是否存在session_key为该sessionid 的一条记录,该记录的数据字典里面是否 包含了 usertype 为 mgr 的 数据。

前面实现的代码中, 这些请求都是在dispatcher入口函数处理的,我们就只需在该dispatch中进行验证。

修改 mgr/customer.py 的dispatcher 函数,在前面加上如下代码

    # 根据session判断用户是否是登录的管理员用户
    if 'usertype' not in request.session:
        return JsonResponse({
            'ret': 302,
            'msg': '未登录',
            'redirect': '/mgr/sign.html'}, 
            status=302)

    if request.session['usertype'] != 'mgr' :
        return JsonResponse({
            'ret': 302,
            'msg': '用户非mgr类型',
            'redirect': '/mgr/sign.html'} ,
            status=302)

注意request对象里面的session属性对应的就是 session记录里面的 数据。

该数据对象类似字典,所以检查是否有usertype类型为mgr的信息,就是这样写

if request.session['usertype'] != 'mgr' 



目前为止,我们项目代码,在如下百度网盘中的 bysms_07.zip

百度网盘链接:https://pan.baidu.com/s/1nUyxvq6IYykBNtPUf4Ho6w

提取码:9w2u

这里面的前端代码包含了用户登录的界面,登录地址为 http://localhost/mgr/sign.html