二十九、实战演练之用户认证
创始人
2025-05-30 02:27:21
0

用户认证

身份验证是将传入请求与一组标识凭据(例如请求来自的用户或用于签名的令牌)相关联的机制。然后,权限和限制策略可以使用这些凭据来确定是否应该允许请求。

1. 安装RESTframework

(1) 安装 

pip install djangorestframework

(2)注册

在配置INSTALLED_APPS 中添加restframework

2. 用户认证方案

REST framework 提供了许多开箱即用的身份验证方案,还允许您实现自定义方案。

(1)BasicAuthentication

此身份验证方案使用HTTP基本身份验证,根据用户的用户名和密码进行签名。基本身份验证通常仅适用于测试。

(2)TokenAuthentication

此身份验证方案使用简单的基于令牌的HTTP 身份验证方案。令牌身份验证适用于客户端-服务器设置,例如本机桌面和移动客户端。

要使用该TokenAuthentication 方案,您需要配置身份验证类以包含TokenAuthentication ,并另外包含

rest_framework.authtoken 在您的INSTALLED_APPS 设置中:

INSTALLED_APPS = [ ...'rest_framework.authtoken' 
]

因为token保存在数据中,所以还需要数据库迁移。

(3)SessionAuthentication

此身份验证方案使用Django 的默认会话后端进行身份验证。会话身份验证适用于在与您的网站相同的会话上下文中运行的A JAX 客户端。

特点:

  • 保持在服务端, 增加服务器开销
  • 分布式架构中, 难以维持Session会话同步
  • CSRF攻击风险

(4)JSON Web Token认证

JSON Web Token 是一个相当新的标准,可用于基于令牌的身份验证。与内置的TokenAuthentication 方案不同,JWT Authentication 不需要使用数据库来验证令牌。

① jwt原理

JSON Web Token (缩写JWT)是目前最流行的跨域认证解决方案。 

jwt的原理是,服务器认证以后,生成一个JSON对象,发回给用户,就像下面这样。

{"姓名": "大侠","角色": "管理员","到期时间": "2020年10月1日0点0分"
}

以后,用户与服务端通信的时候,都要发回这个JSON 对象。服务器完全只靠这个对象认定用户身份。为了防止用户篡改数据,服务器在生成这个对象的时候,会加上签名(详见后文)。

服务器就不保存任何session 数据了,也就是说,服务器变成无状态了,从而比较容易实现扩展。

② JWT的数据结构

实际的JWT 大概就像下面这样。

eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.
eyJ1c2VybmFtZSI6InB5MzQiLCJleHAiOiIxNjAxNDU4ODI2LjM5MjU5NyJ9.
e1c994e615cfbf3a81a13076b7d05c98a752bbd9381f551ad568ef287d439980

 复制前面两段进行base64解密看一下。

 

第三段签名是根据你的SECRET_KEY去进行算法。 

它是一个很长的字符串,中间用点(.)分隔成三个部分。注意,JWT 内部是没有换行的,这里只是为了便于展示,将它写成了几行。

JWT 的三个部分依次如下。

  • Header(头部
  • Payload(负载)
  • Signature(签名)

③ JWT的使用方式

客户端收到服务器返回的JWT,可以储存在Cookie 里面,也可以储存在localStorage。

此后,客户端每次与服务器通信,都要带上这个JWT。你可以把它放在Cookie 里面自动发送,但是这样不能跨域,所以更好的做法是放在HTTP 请求的头信息Authorization字段里面。

Authorization: Bearer 

另一种做法是,跨域的时候,JWT 就放在POST 请求的数据体里面。特点:

  • 保存在客户端
  • 跨语言、跨平台拓展性强
  • 鉴权性能高
  • 本项目使用此种验证

3. 设置认证方案 

(1)安装jwt插件

RESTframework没有实现jwt验证,第三方包 djangorestframework-simplejwt提了可拔插的jwt验证功能。使用pip进行安装:

pip install djangorestframework-simplejwt

并在INSTALLED_APPS 中注册

INSTALLED_APPS = [ ...'rest_framework_simplejwt', ...
]

(2)配置认证类

RESTframework使用配置DEFAULT_AUTHENTICATION_CLASSES 来设置默认的全局用户验证方案。在项目配置中添加如下配置:

REST_FRAMEWORK = { 'DEFAULT_AUTHENTICATION_CLASSES': ['rest_framework_simplejwt.authentication.JWTAuthentication', 'rest_framework.authentication.SessionAuthentication',]
}

REST framework 将尝试对列表中的每个类进行身份验证,并将设置request.user 和request.auth 使用成功身份验证的第一个类的返回值。

如果没有类进行身份验证,request.user 则将设置为的实例

django.contrib.auth.models.AnonymousUser ,并将request.auth 设置为None 。

上面的配置表示先进行jwt验证,如果不成功就是使用session验证。

相关内容

热门资讯

英媒:特里皮尔与两名金发女郎约... 直播吧6月15日讯 据太阳报消息称,近日特里皮尔被拍到在两个不同的夜晚与两名金发女郎外出聚会,而他的...
原创 新... 湖南常德,一桩荒唐事发生在婚礼前夕。新郎陈某担心几位担任伴郎的兄弟玩得太晚,耽误第二天一早的接亲。情...
燕明星调研指导柳林成家庄镇集体... 6 月 13 日,县委副书记、县长燕明星深入成家庄镇,就集体林权制度改革工作开展专题调研指导,探寻生...
原创 重... 2025年6月14日晚20时40分许,重庆市巴南区李家沱街道某小区门口发生一起悲剧。 38岁的男子熊...
紧急送医!18月大婴儿被灌50... 近日 台州恩泽医院公布一起 婴幼儿被灌啤酒引发紧急情况的病例 据院方介绍 幼儿父母经营饭店 当日午间...
原创 动... 据澎湃新闻报道,美国加利福尼亚州长纽森9日上午在社交媒体发文说,美国总统特朗普竟然威胁要逮捕他,这种...
世俱杯揭幕战-乌斯塔里扑点梅西... 北京时间6月15日8时,2025年世俱杯揭幕战暨A组小组赛首轮在美国硬石体育场展开角逐,东道主迈阿密...
主场击败山东泰山,于根伟:间歇... 直播吧6月15日讯 中超联赛第14轮,天津津门虎主场1-0击败山东泰山。津门虎主帅于根伟更新个人社交...
最高检印发文物保护领域检察公益... 最高检公益诉讼检察厅印发 《文物保护领域检察公益诉讼 办案指引(试行)》 进一步明确立案标准 细化调...