认证:(auth | authentication)

REST framework 提供了一些开箱即用的身份验证方案,并且还允许你实现自定义方案。

rest_framework.authentication 中 查看 认真方案

方案的 基类from rest_framework.authentication import BaseAuthentication

  • 基于用户名密码的 认证
  • BasicAuthentication(BaseAuthentication)
  • 基于Session的认证
    • SessionAuthentication(BaseAuthentication)
  • 基于Token 的认证
    • TokenAuthentication(BaseAuthentication)
  • 基于远程用户的认证(专用用户管理服务器)
    • RemoteUserAuthentication(BaseAuthentication)

认证的流程

rest_framework 中的

  • 在APIView 的 dispatch() 方法 执行 了 和 普通djando 不一样的方法 self.initial(request,*,**) 方法 中 添加了新动作 (版本号的获取,认证,权限,频率限制)

    顺序 先认证 再权限 再限制

    认证

    self.perform_authentiction(request)

    权限

    self.check_permissions(request)

    限制

    self.check_throttles(request)

自定义认证 token

  • 创建一个APP 将所有的 版本控制 认证 权限 与 主业务 区分开

定义一个类继承 BaseAuthentication 基于Token的认证

注意:

  • 不做认证 就不会有 request.user 个人用户信息

  • 重写 authenticte() 方法 通过 request.query_params.get('token') 获取 token 参数

  • 通过认证必须返回两个参数 第一个是用户的 queryset 对象 第二个是token 值 元组的形式

  • 错误或异常 需要抛出 AuthenticationFailed 错误

# 所有 认证 的 父类
from rest_framework.authentication import BaseAuthentication
from auth_demo import models
# 不通过认证 需要抛出的 字段错误
from rest_framework.exceptions import AuthenticationFailed class LoginAuth(BaseAuthentication): 重写父类的 authenticte 方法 认证信息携带在 params 路由参数中
def authenticate(self, request): token = request.query_params.get('token')
if token:
# 如果请求的URL中携带了token参数
user_obj = models.UserInfo.objects.filter(token=token).first()
if user_obj:
# token是有效的
return user_obj, token # request.user, request.auth
else:
raise AuthenticationFailed('无效的token')
else:
raise AuthenticationFailed('请求的URL中必须携带token参数')

操作流程:

  1. 创建用户表 认证登录操作 最好额外创建APP

    from django.db import models
    class UserInfo(models.Model):
    name = models.CharField(max_length=32)
    pwd = models.CharField(max_length=32)
    # token 设置为可以为空 查询时可以为空的字段 有时注册了但没有登录
    token = models.CharField(max_length=128, null=True, blank=True)
  2. 创建 注册需要的 接口 127.0.0.1:8000/user/register/

    # 一级路由
    from django.conf.urls import url, include urlpatterns = [
    url(r'^users/', include('auth_demo.urls')),
    ] # 二级路由
    from django.conf.urls import url, include
    from auth_demo import views
    urlpatterns = [
    url(r'^register/$', views.RegisterView.as_View()),
    ]
  3. 创建注册的视图类 Register

    from rest_framework.views import APIView
    from rest_framework.response import Response
    from auth_demo import models
    class RegisterView(APIView):
    ''' 注册用户的试图 只提供 post 请求 '''
    def post(self, request):
    # 获取 用户名密码
    name, pwd = request.data.get('name'), request.data.get('pwd')
    # 可以做一些 账号密码的 限制
    if name and pwd:
    models.UserInfo.objects.create(name=name,pwd=pwd)
    return Response('创建成功')
    else:
    return Response('无效的参数')
  4. 登录之后使用uuid.uuid1().hex生成token 保存到数据库中

    使用 update_or_create 方法 有就更新 没有就新增


    class LoginView(APIView):
    def post(self, request):
    name = request.data.get('name')
    pwd = request.data.get('pwd')
    if name and pwd:
    user_obj = models.UserInfo.objects.filter(name=name, pwd=pwd).first()
    if user_obj:
    # 登陆成功
    # 生成token(时间戳 + Mac地址)
    token = uuid.uuid1().hex
    # 1.保存在用户表中
    user_obj.token = token
    user_obj.save()
    # 2.给用户返回
    return Response({'error_no': 0, 'token': token}) else:
    # 用户名或密码错误 通过 error_no 来判断请求是否成功
    return Response({'error_no': 1, 'error': '用户名或密码错误'})
    else:
    return Response('无效的参数')
  5. 将认证的 类添加到 配置项中

    全局配置

    # 后面的 权限 是基于 认证的  所以全局一定要配置 权限
    REST_FRAMEWORK = {
    # 自定义的 认证
    # 'DEFAULT_AUTHENTICATION_CLASSES': ['auth_demo.auth.MyAuth', ],
    # 使用 rest_framework 给出的认证
    # 'DEFAULT_AUTHENTICATION_CLASSES': ['rest_framework.authentiction.TokenAuthentication', ]
    # 限制比较宽松的认证
    'DEFAULT_AUTHENTICTION_CLASSES': []
    }

    局部配置

    # 写在单独的试图中
    authentication_classes = [MyAuth, ]

Django-rest-framework 接口实现 认证:(auth | authentication)的更多相关文章

  1. Django Rest framework 框架之认证使用和源码执行流程

    用这个框架需要先安装: pip3 install djangorestframework 如果写了一个CBV的东西,继承了View. # 继承Django里面View class APIView(Vi ...

  2. Django REST framework 自定义(认证、权限、访问频率)组件

    本篇随笔在 "Django REST framework 初识" 基础上扩展 一.认证组件 # models.py class Account(models.Model): &qu ...

  3. Django REST framework 之JWT认证

    Json Web Token 1.JWT简介 JWT 是一个开放标准(RFC 7519),它定义了一种用于简洁,自包含的用于通信双方之间以 JSON 对象的形式安全传递信息的方法.JWT 可以使用 H ...

  4. Django REST framework 之 API认证

    RESTful API 认证 和 Web 应用不同,RESTful APIs 通常是无状态的, 也就意味着不应使用 sessions 或 cookies, 因此每个请求应附带某种授权凭证,因为用户授权 ...

  5. Django REST framework 的TokenAuth认证及外键Serializer基本实现

    一,Models.py中,ForeignKey记得要有related_name属性,已实现关联对象反向引用. app_name = models.ForeignKey("cmdb.App&q ...

  6. Django REST framework基础:认证、权限、限制

    认证.权限和限制 身份验证是将传入请求与一组标识凭据(例如请求来自的用户或其签名的令牌)相关联的机制.然后 权限 和 限制 组件决定是否拒绝这个请求. 简单来说就是: 认证确定了你是谁 权限确定你能不 ...

  7. django rest framework权限和认证

    Django rest framework之权限 一.Authentication用户认证配置 1.四种验证及官网描述: BasicAuthentication 此身份验证方案使用HTTP基本身份验证 ...

  8. Django自带的用户认证auth模块

    一.介绍 基本上在任何网站上,都无可避免的需要设计实现网站的用户系统.此时我们需要实现包括用户注册.用户登录.用户认证.注销.修改密码等功能. 使用Django,我们可以不需要自己写这些功能,因为Dj ...

  9. Django项目:CMDB(服务器硬件资产自动采集系统)--03--03CMDB信息安全API接口交互认证

    #settings.py """ Django settings for AutoCmdb project. Generated by 'django-admin sta ...

随机推荐

  1. nginx配置反向代理和负载均衡

    一.反向代理 说明:应该有一个nginx服务器有多个应用服务器(可以是tomcat),本文使用一台虚拟机,安装一个nginx,多个tomcat,来模拟 upstream tomcats{ server ...

  2. 【Java每日一题】20170208

    20170207问题解析请点击今日问题下方的“[Java每日一题]20170208”查看(问题解析在公众号首发,公众号ID:weknow619) package Feb2017; public cla ...

  3. spring aop 实践

    之前用的ssm框架,大部分只是利用spring的IOC特性,很明显这能够为我们开发人员在对象的创建上面节省大部分时间.当相似得到业务越来越多,很多代码也是越来越重复,轮子是越来越重复,比如验证用户登录 ...

  4. Module的加载实现

    烂笔头开始记录小知识点啦- 浏览器要加载 ES6模块,: <script type="module" src="./foo.js"></scr ...

  5. angular ng-repeat出来的数据 每条修改数据后返回给接口 如何取到每个对应修改的值

    接口结构 $scope.DataList = [ { "dataA":"numA", "dataB":"numB"a } ...

  6. 获取邮箱的DNS和MX 工具类

    1.导入Maven  DNS  包: <dependency> <groupId>dnsjava</groupId> <artifactId>dnsja ...

  7. vue从入门到进阶:vue-router路由功能(九)

    基本使用 html: <script src="https://unpkg.com/vue/dist/vue.js"></script> <scrip ...

  8. 洛谷P4213 Sum(杜教筛)

    题目描述 给定一个正整数N(N\le2^{31}-1)N(N≤231−1) 求ans_1=\sum_{i=1}^n\phi(i),ans_2=\sum_{i=1}^n \mu(i)ans1​=∑i=1 ...

  9. 一文读懂机器学习大杀器XGBoost原理

    http://blog.itpub.net/31542119/viewspace-2199549/ XGBoost是boosting算法的其中一种.Boosting算法的思想是将许多弱分类器集成在一起 ...

  10. css和HTML布局小技巧

    一:水平居中 1. 如下所示,让child在parent中水平居中 <!DOCTYPE html> <html> <head lang="en"> ...