在django中创建项目时应用基础鉴权

本文涉及的产品
Serverless 应用引擎 SAE,800核*时 1600GiB*时
云原生网关 MSE Higress,422元/月
应用实时监控服务ARMS - 应用监控,每月50GB免费额度
简介: 【6月更文挑战第7天】本文探讨了在django中的API权限管理,即用户认证的两种方法:基础认证和会话认证。Django REST Framework默认使用会话认证,但也提供基础、令牌和JWT等其他选项。根据项目需求,应谨慎选择适合的认证方案。

简介

我们了解一些基本的认证方式如下。

mandala曼德罗符号.png

基础认证:简单但效率低、安全性差,适用于HTTPS环境。
会话认证:更安全,通过Cookie和会话ID管理,但不适用于多域和效率要求高的场景。
令牌和JWT认证:兼顾简单和安全。

1 用户认证 User Authentication

我们需要更新API权限,也称为授权。在本章我们将实现身份验证,这是用户可以注册的过程,新用户的登录登出控制等.

传统的整体式Django网站认证中,认证更为简单,涉及基于会话的Cookie模式,我们将在下面进行回顾。但是使用API会有些棘手。

需要注意的是,HTTP是无状态协议,因此没有内置的方式可以记住用户是否从一个请求到下一个请求进行了身份验证。每次用户请求受限资源时,必须验证自己。

2 基础认证 Base Authentication

之前发送批准的身份验证凭据授予访问权限。 大致交互流程如下:

1). 客户端发起HTTP请求
2). 服务器使用HTTP响应进行响应,该HTTP响应包含401(未授权)状态代码和WWW-Authenticate HTTP标头,其中包含有关如何授权的详细信息
3). 客户端通过Authorization HTTP标头发送回凭据
4). 服务器检查凭据并以200 OK或403 Forbidden状态代码响应

批准访问后,客户端将发送带有Authorization HTTP标头的所有以后的请求证书。图示过程如下:

    Client                                                Server
    GET / HTTP/1.1 ---->
                                          <--------HTTP/1.1 401 Unauthorized WWW-Authenticate: Basic
    GET / HTTP/1.1 
       Authorization:   Basic d3N2OnBhc3N3b3JkMTIz 
                       ------------->
                                                  <------ HTTP/1.1 200 OK

请注意,发送的授权凭证是未加密的,
如: wsv:password123的base64编码后为 d3N2OnBhc3N3b3JkMTIz.

这种方法的主要优点是简单。但是有几个主要缺点。

首先,对于每个单个请求,服务器都必须查找并验证用户名和密码,效率低下。

最好先查找一次,然后传递一些令牌表示该用户已获批准的一种。

其次,用户凭据以明文形式传递,而不是通过互联网完全加密。这是非常不安全的,任何未加密的互联网数据都可以轻松被抓取和使用。

最后,这种方法 通常用于https加密传输 。

3 会话认证 Session Authentication

Django使用会话和Cookie的组合认证。在较高级别上,客户端使用其身份验证凭据(用户名&密码),然后从存储的服务器接收会话ID作为Cookie。然后,此会话ID将在以后的每个HTTP请求的标头中传递。

传递会话ID后,服务器将使用它来查找包含所有内容的会话对象给定用户的可用信息,包括凭据。
这种方法是有状态的,因为必须在两台服务器(会话对象)和客户端(会话ID)。

基本流程如下:

1,用户键入登录凭据(用户名,密码)。

2,服务器校验凭据是否正确并生产一个会话对象 并 存储在数据库。

3,服务器发送客户端 会话ID,并不是session 对象本身,sessin本身作为cookie存储在浏览器。

4,将来所有 此会话的请求,其HTTP header都将包含 session ID, 如果经数据库校验通过,请求将被允许。

5,一旦用户登出一个应用,会话ID将被同时在服务器和客户端摧毁。

6,如果用户稍后再次登录,新的会话将产生并作为 cookie 存储在客户端。

Django_REST_Framework中的默认设置实际上是使用Django的 身份验证和会话身份验证组合。 session ID通过后将在HTTP header中传递于每一个请求。

  • 优点是,由于用户凭据仅发送一次,因此它更加有效和安全。

      并非在每个请求/响应周期中都像基本身份验证中那样。 
      服务器不必每次都验证用户的凭据,只需匹配会话ID到快速查找的会话对象。
    
  • 缺点是, 首先,会话ID仅在登录已执行的浏览器中有效;它不能跨多个域工作。

       这是一个明显的问题,当一个API需要支持多个前端很麻烦,例如网站和移动应用程序。
       第二,会话对象必须保持最新,这在具有多个站点的大型站点中可能是一个挑战。您如何在每个服务器上保持会话对象的准确性?
       第三,对于每个单独的请求,即使是不需要身份验证的请求,都会发送Cookie 效率低下。
    通常不建议对任何API使用基于会话的身份验证方案,如果将有多个前端,网页和APP。
    

4 小结

用户认证的解决方案在每个项目中可以选择不同的方式,通常是在HTTP请求中传递唯一的标识符。

我们已创建用于注册,登录和注销的API端点。
但是标识符的形式不是公认的方法,它可能需要多个形式。 Django REST Framework随附了四个不同的内置身份验证选项:基本,会话,令牌和默认值。

而且还有更多的第三方软件包可提供额外的JSON Web令牌(JWT)等功能。
审查每种方法的弊端,然后为我们的Blog接口做出明智的选择。

目录
相关文章
|
8天前
|
机器学习/深度学习 人工智能 算法
植物病害识别系统Python+卷积神经网络算法+图像识别+人工智能项目+深度学习项目+计算机课设项目+Django网页界面
植物病害识别系统。本系统使用Python作为主要编程语言,通过收集水稻常见的四种叶片病害图片('细菌性叶枯病', '稻瘟病', '褐斑病', '稻瘟条纹病毒病')作为后面模型训练用到的数据集。然后使用TensorFlow搭建卷积神经网络算法模型,并进行多轮迭代训练,最后得到一个识别精度较高的算法模型,然后将其保存为h5格式的本地模型文件。再使用Django搭建Web网页平台操作界面,实现用户上传一张测试图片识别其名称。
55 21
植物病害识别系统Python+卷积神经网络算法+图像识别+人工智能项目+深度学习项目+计算机课设项目+Django网页界面
|
7天前
|
机器学习/深度学习 算法 TensorFlow
交通标志识别系统Python+卷积神经网络算法+深度学习人工智能+TensorFlow模型训练+计算机课设项目+Django网页界面
交通标志识别系统。本系统使用Python作为主要编程语言,在交通标志图像识别功能实现中,基于TensorFlow搭建卷积神经网络算法模型,通过对收集到的58种常见的交通标志图像作为数据集,进行迭代训练最后得到一个识别精度较高的模型文件,然后保存为本地的h5格式文件。再使用Django开发Web网页端操作界面,实现用户上传一张交通标志图片,识别其名称。
37 6
交通标志识别系统Python+卷积神经网络算法+深度学习人工智能+TensorFlow模型训练+计算机课设项目+Django网页界面
|
4天前
|
机器学习/深度学习 人工智能 算法
【新闻文本分类识别系统】Python+卷积神经网络算法+人工智能+深度学习+计算机毕设项目+Django网页界面平台
文本分类识别系统。本系统使用Python作为主要开发语言,首先收集了10种中文文本数据集("体育类", "财经类", "房产类", "家居类", "教育类", "科技类", "时尚类", "时政类", "游戏类", "娱乐类"),然后基于TensorFlow搭建CNN卷积神经网络算法模型。通过对数据集进行多轮迭代训练,最后得到一个识别精度较高的模型,并保存为本地的h5格式。然后使用Django开发Web网页端操作界面,实现用户上传一段文本识别其所属的类别。
18 1
【新闻文本分类识别系统】Python+卷积神经网络算法+人工智能+深度学习+计算机毕设项目+Django网页界面平台
|
2天前
|
Linux Python
解决django项目报错很离谱的报错之RuntimeError: populate() isn't reentrant
解决django项目报错很离谱的报错之RuntimeError: populate() isn't reentrant
|
4天前
|
机器学习/深度学习 人工智能 算法
【果蔬识别系统】Python+卷积神经网络算法+人工智能+深度学习+计算机毕设项目+Django网页界面平台
【果蔬识别系统】Python+卷积神经网络算法+人工智能+深度学习+计算机毕设项目+Django网页界面平台。果蔬识别系统,本系统使用Python作为主要开发语言,通过收集了12种常见的水果和蔬菜('土豆', '圣女果', '大白菜', '大葱', '梨', '胡萝卜', '芒果', '苹果', '西红柿', '韭菜', '香蕉', '黄瓜'),然后基于TensorFlow库搭建CNN卷积神经网络算法模型,然后对数据集进行训练,最后得到一个识别精度较高的算法模型,然后将其保存为h5格式的本地文件方便后期调用。再使用Django框架搭建Web网页平台操作界面,实现用户上传一张果蔬图片识别其名称。
18 0
【果蔬识别系统】Python+卷积神经网络算法+人工智能+深度学习+计算机毕设项目+Django网页界面平台
|
1月前
|
运维 Devops 测试技术
一个人活成一个团队:python的django项目devops实战
DevOps通过自动化的流程,使得构建、测试、发布软件能够更加地快捷、频繁和可靠。本文通过一个python的django个人博客应用进行了DevOps的实战,通过DevOps拉通开发和运维,通过应用云效的DevOps平台实现自动化“软件交付”的流程,使得构建、测试、发布软件能够更加地快捷、频繁和可靠,提交研发交付效率。作为个人项目也是可以应用devops提高效率。
37 3
|
28天前
|
中间件 数据库连接 UED
Django中间件秘籍:如何用几行代码让你的应用变得超级强大?
【8月更文挑战第31天】中间件是Django框架的核心特性,位于视图与HTTP服务器之间,允许全局处理请求和响应,增强Web应用功能。通过实现`MiddlewareMixin`类的方法,如`process_request`和`process_response`,可以轻松实现请求预处理或响应后处理。中间件应用场景广泛,包括用户认证、CSRF防护和数据库连接管理等。创建并配置中间件需将其加入`settings.py`的`MIDDLEWARE`列表,顺序决定执行优先级。合理利用中间件能提高代码重用性和应用性能,带来更好的用户体验。
28 0
|
1月前
|
JSON API 数据安全/隐私保护
Django 后端架构开发:JWT 项目实践与Drf版本控制
Django 后端架构开发:JWT 项目实践与Drf版本控制
33 0
|
1月前
|
前端开发 JavaScript Linux
【Azure 应用服务】在Azure App Service for Linux环境中,部署的Django应用,出现加载css、js等静态资源文件失败
【Azure 应用服务】在Azure App Service for Linux环境中,部署的Django应用,出现加载css、js等静态资源文件失败
|
1月前
|
存储 前端开发 Serverless
中后台前端开发问题之Django项目中接收和处理用户的抽奖请求如何解决
中后台前端开发问题之Django项目中接收和处理用户的抽奖请求如何解决
13 0