Django-Vue搭建个人博客:用户管理

教程来源 杜塞-django-vue系列
博客链接 传送门

Web 程序是使用 HTTP 协议传输的,而 HTTP 协议是无状态的协议,对于事务没有记忆能力。也就是说,如果没有其他形式的帮助,服务器是没办法知道前后两次请求是否是同一个用户发起的,也不具有对用户进行身份验证的能力。

传统 web 开发中(以及前面的章节),身份验证通常是基于 Session 会话机制的。Session 对象存储特定用户会话所需的属性及配置信息。
Session是存储在服务器端的,当用户访问获取session后,session保存到后端,用户转跳或重定向网页时就不会出现Session丢失,但这无疑加大了服务器的压力。

另一种比较常用的身份验证方式是 JWT (JSON Web Token) 令牌。JWT 是一种开放标准,它定义了一种紧凑且自包含的方式,用于在各方之间作为 JSON 对象安全地传输信息。
由于由于 Token 是经过数字签名的,因此可以被验证和信任。JWT 非常适合用于身份验证和服务器到服务器授权。与 Session 不同,JWT 的 Token 是保存在用户端的,即摆脱了对服务器的依赖。

jtw令牌:

eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJ0b2tlbl90eXBlIjoiYWNjZXNzIiwiZXhwIjoxNjA5MjEwMjg0LCJqdGkiOiJiNzMxMTliMTZjNWM0YTExODNkOGJiZTNhZDZmZmYzMyIsInVzZXJfaWQiOjJ9.59ZavqFzjE3EoDrniu2cwgc_cq1Rv1OxpZeqRte_HLw

在进行某些需要验证身份的业务中,用户需要把令牌一并提交(就跟提交用户名及密码类似)。

这里有详细的 JWT 工作方式讲解

本章尝试将身份验证方法更改为 JWT 形式。

代码修改

首先pip安装djangorestframework-simplejwt这个 jwt 库:

> pip install djangorestframework-simplejwt

修改配置文件,将原有的sessions改为jwt验证机制:

# drf_vue_blog/settings.py
REST_FRAMEWORK = {
	···
    'DEFAULT_AUTHENTICATION_CLASSES': (
        'rest_framework_simplejwt.authentication.JWTAuthentication',
    )
}

在跟路由添加Token的湖泊去和刷新:

from rest_framework_simplejwt.views import TokenObtainPairView,TokenRefreshView、
urlpatterns = [
	···
    path('api/token/',TokenObtainPairView.as_view(),name = 'token_obtain_pair'),
    path('api/token/refresh.',TokenRefreshView.as_view(),name='token_refresh')
],
```这就完成了,这个第三方库甚至不需要我们继承重写。
## 测试
先携带用户名和密码来请求获得token:
```python
>http http://127.0.0.1:8000/api/token/ username=xianwei password=admin123456
HTTP/1.1 200 OK
···

{
    "access": "eyJ(···)iJ9.eyJ(···)jN9.BQZlZg2EQOWWueVbB74tHzE1KYoMBgi_mzkgdd7E6V0",
    "refresh": "eyJ(···)iJ9.eyJ(···)zfQ.FiPUQCbiESZTIpkG1R6XgOekd-YwXNu6f_yu-KBu7ZM"
}

拿到 Token 后,就可以用 Token 作为你的身份令牌,进行正常的资源请求了:

发送带有token的修改请求

>http PATCH http://127.0.0.1:8000/api/article/18/ title=jwt "Authorization: Bearer eyJ······"
HTTP/1.1 200 OK

{
    "author": {
        "date_joined": "2021-06-13T14:58:00",
        "id": 3,
        "last_login": null,
        "username": "xianwei"
    },
    "avatar": null,
    "body": "111",
    "body_html": "<p>111</p>",
    "category": null,
    "created": "2021-06-21T20:47:13",
    "id": 18,
    "tags": [],
    "title": "jwt",
    "toc_html": "<div class=\"toc\">\n<ul></ul>\n</div>\n",
    "updated": "2021-06-21T20:57:01.751385",
    "url": "http://127.0.0.1:8000/api/article/18/"
}

jwt令牌默认有效期是五分钟(可在配置中修改),过期后是无效的没法使用,但是可以用刷新令牌获取新的令牌。

>http post http://127.0.0.1:8000/api/token/refresh/ refresh=eyJ0eX······
HTTP/1.1 200 OK
···
{
    "access": "eyJ0eXAiOiJKV1QiLCJhbGc(····)"
}

功能与用 Session 相同,并且成功切换到 JWT 方式了。

有效期

Token 默认有效期很短,只有 5 分钟。你可以通过修改 Django 的配置文件进行更改:

# drf_vue_blog/settings.py

...

from datetime import timedelta

SIMPLE_JWT = {
    'ACCESS_TOKEN_LIFETIME': timedelta(days=1),
    'REFRESH_TOKEN_LIFETIME': timedelta(days=10),
}

Token 一旦泄露,任何人都可以获得该令牌的所有权限。出于安全考虑,Token 的有效期通常不应该设置得太长。

更多配置项请查看官方文档

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值