Authentication

  认证是将一个传入的请求和一组标识凭据相关联的机制,比如请求过来的用户,或者用户登录时携带的token。

  然后权限策略就能使用这些凭据来决定是否允许这个请求。

  REST框架提供了多种开箱即用的方案,也允许你实施自定义的方案。

  认证总是在view的最开始运行,在权限检查之前,在其他任何代码被允许执行之前。

  request.user属性通常会被设为contrib.auth 包下的User类。

  request.auth属性被用做额外的认证信息。比如,作为一个请求签名的认证token

  记住一点,认证机制自己并没有允许或不允许一个传入的请求,它只是简单的标识请求携带的凭据。

认证方案设定

全局

REST_FRAMEWORK = {
...
'DEFAULT_AUTHENTICATION_CLASSES': (
'rest_framework.authentication.TokenAuthentication',
'rest_framework.authentication.BasicAuthentication'
),
}
#默认是session+basic
#对于前后端分离的项目,session认证一般删掉,使用token,basic是必须放在这里的。
#在settings里设置默认认证类,然后会自上而下拿着请求来验证,然后使用第一个成功认证的类返回用户对象request.user (用户信息)和request.auth(认证信息)。
#如果没有类认证,request.user 会被设为 django.contrib.auth.models.AnonymousUser一个实例,request.auth 会设置为 None.

局部

from rest_framework.authentication import SessionAuthentication, BasicAuthentication
from rest_framework.permissions import IsAuthenticated
from rest_framework.response import Response
from rest_framework.views import APIView class ExampleView(APIView):
authentication_classes = (SessionAuthentication, BasicAuthentication)
permission_classes = (IsAuthenticated,) def get(self, request, format=None):
content = {
'user': unicode(request.user), # `django.contrib.auth.User` instance.
'auth': unicode(request.auth), # None
}
return Response(content)

  

Unauthorized and Forbidden responses

当一个未被认证的请求被拒绝时,有两种合适的error code

401返回必须包含一个WWW-Authenticate header,指导客户端需要如何认证。

403返回没有包含WWW-Authenticate header。

使用哪种返回,取决于认证方案。虽然有多种认证方案在使用,但可能只有一个方案用于决定返回的类型。

在确定响应类型时,将使用视图上设置的第一个身份验证类

注意:当一个请求被成功认证时,但还是被拒绝执行请求,这种情况下,不论时哪种认证方案,总是使用403返回。

authentication.py源码分析

class BaseAuthentication(object):
"""
All authentication classes should extend BaseAuthentication.
""" def authenticate(self, request):
"""
Authenticate the request and return a two-tuple of (user, token).
"""
raise NotImplementedError(".authenticate() must be overridden.") def authenticate_header(self, request):
"""
Return a string to be used as the value of the `WWW-Authenticate`
header in a `401 Unauthenticated` response, or `None` if the
authentication scheme should return `403 Permission Denied` responses.
"""
pass
#所有认证类都是基于它扩展

  

BasicAuthentication

这个方案使用HTTP Basic Authentication,使用用户的username和password进行签名。一般只适合用于测试。

如果成功认证,它会提供以下凭据:

  • request.user will be a Django User instance.
  • request.auth will be None.

未认证时返回401,带一个WWW-Authenticate header。比如:

WWW-Authenticate: Basic realm="api"

TokenAuthentication

单单使用一个token-based HTTP认证方案。

首先需要在认证类设置中包含TokenAuthentication

此外在INSTALLED_APPS 设置中包含rest_framework.authtoken

INSTALLED_APPS = (
...
'rest_framework.authtoken'
)

  

然后要同步数据库,因为rest_framework.authtoken会提供 Django database migrations.

[root@webmaster mofangsvr]# python3.7 manage.py showmigrations

authtoken
[ ] 0001_initial
[ ] 0002_auto_20160226_1747
cmdb
[X] 0001_initial
#有个authtoken的app,有两个migrations没有同步 python3.7 manage.py migrate authtoken
#同步数据

  

然后要创建url

from rest_framework.authtoken import views
urlpatterns += [
path('api-token-auth/', views.obtain_auth_token)
]
#在项目urls.py中加入就行

  

token测试

# curl -X POST -H "Content-Type:application/json" -d '{"username":"yueju_view","password":"123@abAB"}' http://192.168.10.10:8001/api-token-auth/
{"token":"e3205a50505096dacb3fbbadc7de79cd95b3af45"}
#服务端返回了一个token
#在authtoken_token表中产生了一条数据,和user_id关联,但会发现没有过期时间

  

class SvrprocessconfigTestViewSet(viewsets.ModelViewSet):

    serializer_class = SvrprocessconfigSerializer
permission_classes = (IsAuthenticated,)
#在一个类视图中使用认证权限

  

curl -X GET http://192.168.10.10:8001/cmdb/svrprocess_Test/
{"detail":"身份认证信息未提供。"}
#这时无法访问,后台401认证错误

  

curl -X GET http://192.168.10.10:8001/cmdb/svrprocess_Test/ -H 'Authorization: Token e3205a50505096dacb3fbbadc7de79cd95b3af45'
#带上token,则成功返回数据

  

JWT认证

http://getblimp.github.io/django-rest-framework-jwt/

测试方式和token的一样,唯一不一样的就是token串变得长了几倍,然后内容每次都是不一样的。

去查源码,可以发现是因为在串里加入了时间再进行加密。

过期时间

JWT_AUTH = {
'JWT_EXPIRATION_DELTA': datetime.timedelta(seconds=20),
}
#jwt设置的默认过期时间是300s,可在项目settings中调整
#如果过期,则token不再生效。报以下错误 {"detail":"Signature has expired."}

  

  

DRF教程7-token认证的更多相关文章

  1. python 全栈开发,Day97(Token 认证的来龙去脉,DRF认证,DRF权限,DRF节流)

    昨日内容回顾 1. 五个葫芦娃和三行代码 APIView(views.View) 1. 封装了Django的request - request.query_params --> 取URL中的参数 ...

  2. DRF之版本控制、认证和权限组件

    一.版本控制组件 1.为什么要使用版本控制 首先我们开发项目是有多个版本的当我们项目越来越更新,版本就越来越多,我们不可能新的版本出了,以前旧的版本就不进行维护了像bootstrap有2.3.4版本的 ...

  3. DRF的版本、认证、权限

    DRF的版本 版本控制是做什么用的, 我们为什么要用 首先我们要知道我们的版本是干嘛用的呢~~大家都知道我们开发项目是有多个版本的~~ 当我们项目越来越更新~版本就越来越多~~我们不可能新的版本出了~ ...

  4. drf组件之jwt认证

    drf组件之jwt认证模块 一.认证规则 全称:json web token 解释:加密字符串的原始数据是json,后台产生,通过web传输给前台存储 格式:三段式 - 头.载荷.签名 - 头和载荷才 ...

  5. DRF的JWT用户认证

    目录 DRF的JWT用户认证 JWT的认证规则 JWT的格式 JWT认证的流程 JWT模块的导入为 JWT的使用 DRF的JWT用户认证 从根本上来说,JWT是一种开放的标准(RFC 7519), 全 ...

  6. 42.JSON Web Token认证

    JSON Web Token认证介绍 简称JWT认证,一般用于用户认证 JWT是一种相当新的标准,可用于基于token的身份验证 与内置的TokenAuthentication方案不同,JWT不需要使 ...

  7. 基于Token认证的多点登录和WebApi保护

    在文章中有错误的地方,或是有建议或意见的地方,请大家多多指正,邮箱: linjie.rd@gmail.com 一天张三,李四,王五,赵六去动物园,张三没买票,李四制作了个假票,王五买了票,赵六要直接F ...

  8. 【翻译】asp.net core2.0中的token认证

    原文地址:https://developer.okta.com/blog/2018/03/23/token-authentication-aspnetcore-complete-guide token ...

  9. Java实现基于token认证

    随着互联网的不断发展,技术的迭代也非常之快.我们的用户认证也从刚开始的用户名密码转变到基于cookie的session认证,然而到了今天,这种认证已经不能满足与我们的业务需求了(分布式,微服务).我们 ...

  10. flask token认证

    在前后端分离的项目中,我们现在多半会使用token认证机制实现登录权限验证. token通常会给一个过期时间,这样即使token泄露了,危害期也只是在有效时间内,超过这个有效时间,token过期了,就 ...

随机推荐

  1. SqlServer——游标

    参考:http://www.cnblogs.com/94cool/archive/2010/04/20/1715951.html  http://www.cnblogs.com/moss_tan_ju ...

  2. App.CSharp.Grid的ICells接口

    using System;using System.Collections.Generic;using System.Text;using System.Drawing;using System.Wi ...

  3. .Net时间运算 - DateTime类,TimeSpan类

    DateTime类是.Net中用于处理时间类型数据的. 一.字段 MaxValue 表示 DateTime 的最大可能值.此字段为只读. MinValue     表示 DateTime 的最小可能值 ...

  4. 线段树教做人系列(2)HDU 4867 XOR

    题意:给你一个数组a,长度为.有两种操作.一种是改变数组的某个元素的值,一种是满足某种条件的数组b有多少种.条件是:b[i] <= a[i],并且b[1]^b[2]...^b[n] = k的数组 ...

  5. C++中的纯虚函数和虚函数的作用

    1. 虚函数和纯虚函数可以定义在同一个类(class)中,含有纯虚函数的类被称为抽象类(abstract class),而只含有虚函数的类(class)不能被称为抽象类(abstract class) ...

  6. Luogu 2824 [HEOI2016/TJOI2016]排序

    BZOJ 4552 挺妙的解法. 听说这题直接用一个桶能拿到$80 \ pts$ 发现如果是一个排列的话,要对这个序列排序并不好做,但是假如是$01$序列的话,要对一个区间排序还是很简单的. 发现最后 ...

  7. SDUT 3342 数据结构实验之二叉树三:统计叶子数

    数据结构实验之二叉树三:统计叶子数 Time Limit: 1000MS Memory Limit: 65536KB Submit Statistic Problem Description 已知二叉 ...

  8. C++面试笔记--const、sizeof

    首先来一个关于const的全面的解释,先看一波代码,之后再进行详细的分情况解释 ; const int *a=&b;//指向一个int常量的指针 int const *a=&b;//和 ...

  9. Java的post请求-----接口测试

    本次主要是对登陆的接口测试post请求,希望记录在博客里面,一点一点的成长. package com.ju.Login; import java.io.BufferedReader; import j ...

  10. yzm10的职业生涯

    yzm10的进阶之路,记录一点一滴的进步,希望与之共勉. 时间 比赛 战绩 2015.11 NOIP2015全国青少年信息学奥林匹克联赛 提高组二等奖 2017.6 青岛大学“六一八杯”校赛个人赛 冠 ...