既然要来学习jwt(json web token),那么我们肯定是先要了解jwt的优势以及应用场景--跨域认证。

$ pip install djangorestframework-jwt

  

传统cookie-session认证步骤:

1、用户向服务器发送用户名和密码。

2、服务器验证通过后,在当前对话(session)里面保存相关数据,比如用户角色、登录时间等等。

在django session表中,session_key,session_data,expire_date.其中session_data保存的是base64编码后的用户对象。

import base64

r = base64.b64decode("NDQ3OGI4MDA3YTI3MzM2NTQ5ZjhhZGZhNzM0ZjM2OWNlOTFmYWQ0ODp7Il9hdXRoX3VzZXJfaWQiOiIxIiwiX2F1dGhfdXNlcl9iYWNrZW5kIjoiZGphbmdvLmNvbnRyaWIuYXV0aC5iYWNrZW5kcy5Nb2RlbEJhY2tlbmQiLCJfYXV0aF91c2VyX2hhc2giOiIyOTBkMjY0YzY3MmMyYmNjZWFiZDRkZWJlZGJjMmQyM2QzNzI5YjBkIn0=")
print(r) >>>
b'4478b8007a27336549f8adfa734f369ce91fad48:{"_auth_user_id":"1","_auth_user_backend":"django.contrib.auth.backends.ModelBackend","_auth_user_hash":"290d264c672c2bcceabd4debedbc2d23d3729b0d"}'

   

3、服务器向用户返回一个 session_id,写入用户的 Cookie。

4、用户随后的每一次请求,都会通过 Cookie,将 session_id 传回服务器。

5、服务器收到 session_id,找到前期保存的数据,由此得知用户的身份。

这种模式的问题在于,扩展性不好。单机当然没有问题,如果是服务器集群,或者是跨域的服务导向架构,就要求 session 数据共享,每台服务器都能够读取 session。

jwt原理

由header,payload,signature三个部分组成

举个栗子

eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJ1c2VyX2lkIjoxLCJ1c2VybmFtZSI6InJvb3QiLCJleHAiOjE1NTI5NzE5ODIsImVtYWlsIjoiMTc4NTg4MDQyNjRAMTYzLmNvbSJ9.KuZq40SkiEz9La1wzXy20irjbckNJ0SNWq2EvXBwf0A

 每部分由.分隔,其中header和payload可由base64直接decode可得

header

{"typ":"JWT","alg":"HS256"}

payload

用户信息,django中取决于UserProfile,UserProfileSerializer

signature

对前两部分的签名,防止数据被篡改。指定一个密钥,使用header中的加密方式

token = base64.b64encode(bytes_header)+"."+base64.b64encode(bytes_payload)+"."+secret

django restframework jwt 集成

settings.py

REST_FRAMEWORK = {
'DEFAULT_AUTHENTICATION_CLASSES': (
'rest_framework_jwt.authentication.JSONWebTokenAuthentication',
'rest_framework.authentication.SessionAuthentication',
'rest_framework.authentication.BasicAuthentication',
),
} JWT_AUTH = {
# 指明token的有效期
'JWT_EXPIRATION_DELTA': datetime.timedelta(days=1),
}

  

  • BasicAuthentication

该认证方案使用 HTTP Basic Authentication,并根据用户的用户名和密码进行签名。Basic Authentication 通常只适用于测试。

  • SessionAuthentication

此认证方案使用 Django 的默认 session 后端进行认证。Session 身份验证适用于与您的网站在同一会话环境中运行的 AJAX 客户端。

urls.py

from rest_framework_jwt.views import obtain_jwt_token

urlpatterns = [
# ...
url(r'^api-token-auth/', obtain_jwt_token),
]

  

集成完后的测试代码

import json

import requests

# 验证jwt
url = "http://127.0.0.1:8000/api-token-auth/?format=json"
data = {
"username": "root",
"password": "Admin123."
}
# data = json.dumps(data)
res = requests.post(url,data=data)
token = res.text
print("token:",token) token = json.loads(token).get("token")
user_url = "http://127.0.0.1:8000/users/?format=json"
headers = {
"Authorization":"JWT "+ token
}
res = requests.get(user_url,headers=headers)
print(res.text)

  

自己实现jwt也非常简单

1) base64加HS256 手写token

2) middleware 验证token

上述1和2的传递是通过request参数,验证成功后只需要我们赋予request.user 一个user对象即可。

django restframework jwt的更多相关文章

  1. django restframework serializer 增加自定义字段

    在使用django restframework serializer 序列化在django中定义的model时,有时候我们需要额外在serializer中增加一些model中没有的字段.有两种方法实现 ...

  2. django restframework

    一.django restframework 请求流程源码剖析 上面的认证一个流程是rest_framework的关于APIauth的认证流程,,这个流程试用权限.频率.版本.认证.这个四个组件都是通 ...

  3. django restframework 快速入门

    django restframework 快速入门 基本流程 建立 Models 依靠 Serialiers 将数据库取出的数据 Parse 为 API 的数据(可用于返回给客户端,也可用于浏览器显示 ...

  4. Django Restframework 实践(一)

    具备以下知识: django http://www.cnblogs.com/menkeyi/p/5882464.html http://www.cnblogs.com/menkeyi/p/588245 ...

  5. django: rest-framework的 分页和过滤

    django: rest-framework的 分页和过滤 2018年06月28日 10:09:01 weixin_42359464 阅读数:136 标签: flaskrestframeworkdja ...

  6. django restframework 的日常使用

    本文讨论 django restframework 的日常使用,满足常用 api 编写的需求,比如 List, Detail, Update, Put, Patch 等等.探讨 django rest ...

  7. Django RestFramework (DRF)

    准备: 下载 pip install djangorestframework 一 APIView源码解析 1 预备知识 CBV(class based view)FBV(function based ...

  8. 测开大佬告诉你:如何5分钟快速创建restful风格的API接口-使用django restframework框架

    一.思考❓❔ 1.创建API接口难吗? 软件测试工程师: 只测过API接口, 从没创建过 应该需要掌握一门后端开发语言和后端开发框架吧!? 脑容量有限,想想就可怕 2.如何创建API接口呢? 使用Dj ...

  9. Django restframework之Token验证的缺陷及jwt的简单使用

    一.主要缺陷: 1.Token验证是放在一张表中,即authtoken_token中,key没有失效时间,永久有效,一旦泄露,后果不可想象,安全性极差. 2.不利于分布式部署或多个系统使用一套验证,a ...

随机推荐

  1. 各种文件用JS转Base64之后的data类型

    1.txt       data:text/plain;base64, 2.doc     data:application/msword;base64, 3.docx   data:applicat ...

  2. SQLServer之修改视图

    修改视图注意事项 修改先前创建的视图. 其中包括索引视图. ALTER VIEW不影响相关的存储过程或触发器,并且不会更改权限. 如果原来的视图定义是使用 WITH ENCRYPTION 或 CHEC ...

  3. iOS 防止UIButton重复点击

    使用UIButton的enabled或userInteractionEnabled 使用UIButton的enabled属性, 在点击后, 禁止UIButton的交互, 直到完成指定任务之后再将其en ...

  4. 调试工具gdb

    1.1 gdb符号调试器简介 gdb是一个用来调试C和C++程序的功能强大的调试器,它能在程序运行时观察程序的内部结构和内存的使用情况. gdb主要提供以下几种功能: 监视程序中变量值的变化 设置断点 ...

  5. Dynamics 365 CRM 开发架构简介

    Dynamics 365 CRM提供了多种编程模型,你可以灵活地按需选用最佳模式. 本文是对Dynamics 365 CRM编程模型的综述. 概览 下图表明了Dynamics 365 CRM的主要可编 ...

  6. requests的基本用法

    r = requests.get('https://api.github.com/events', params = {'key1': 'value1', 'key2': 'value2'}) r = ...

  7. syso快捷键设置

    syso快捷键

  8. HTML&CSS

    行内元素 <a>.<span>.<br>.<i>.<em>.<strong>.<label>.<q>.& ...

  9. KVM架构及模块简介

    1.简介 2.架构 3.KVM模块及QEMU 一.简介 KVM(Kernel Virtual Machine)基于内核的虚拟机.阿维·齐维迪(Avi Kivity)在一家名为Qumranet的初创企业 ...

  10. C语言之四舍五入

    在C语言中,如果进行强制类型转换,它会将所需要取的位数直接提取出来,而其他位数的数字会被直接删除,不会对提取出来的位数有任何影响 所以如果我们需要提高精度,对所取的数进行四舍五入,需要给所需去的数的最 ...