6-4 认证和权限-DRF认证TokenAuthentication认证


目录:

  • 基础配置
  • 路由配置
  • 传递方式

一、基础配置

1、安装rest_framework.authtoken

说明:在settings.py的文件中INSTALLED_APPS

# settings.py
INSTALLED_APPS = (
    ...
    'rest_framework.authtoken'
)

#迁入数据
>python manage.py migrate

2、全局配置和局部配置

说明:如果是全局配置的话,需要在 settings.py文件中配置,但是如果是局部配置,就要在具体的视图中配置。这个根据自己的需求来配置。

# settings.py配置  全局配置:表示对所有视图有效
REST_FRAMEWORK = {
    'DEFAULT_AUTHENTICATION_CLASSES': (
        'rest_framework.authentication.BasicAuthentication',
        'rest_framework.authentication.SessionAuthentication',  
        'rest_framework.authentication.TokenAuthentication',
    ),
}

# 局部配置 :只对当前视图有效
from rest_framework.authentication import SessionAuthentication
from rest_framework.authentication import BasicAuthentication
from rest_framework.authentication import TokenAuthentication

class XXXX(APIView):
			authentication_classes = [BasicAuthentication,TokenAuthentication,SessionAuthentication]

3、全局配置单个不配置

说明:我们可能遇到这种情况,就是全局需要配置,但是我只是单单某个接口不需要认证。那咋办呐。那我就情况认证列表。

class CartView(APIView):
    #局部的

    # 基于什么登录认证的
    authentication_classes = [] # 如果全局配置了,但是这个视图不需要验证,就authentication_classes 变成空列表

    # 只有登录才能访问
    permission_classes = [IsAuthenticated]

    def get(self, request, *args, **kwargs):

        .....

二、 路由配置

我们配置token验证的时候,还有配置路由,验证登录之后,产生token值,后面其他接口 拿到 这个token 值放在 请求 header中,去校验。

在根级路由或者子路由中配置,这个你自己看,我们这边是根级路由配置

from django.contrib import admin
from django.urls import path, include
from rest_framework.authtoken import views  #设置路由,必须导入view

urlpatterns = [
    path('admin/', admin.site.urls),
    path('api/', include('app05.urls')),
    path('api-token-auth/', views.obtain_auth_token) #token哪里来,我们这边还需要配置一个路由,请求生成token
]

我们来看一下 obtain_auth_token 源码:Ctrl + obtain_auth_token 看一下:

 obtain_auth_token =>  ObtainAuthToken

 obtain_auth_token这个类自动帮我们生成一个token。

三、传递方式

3.1、视图编写

说明:编写Views.py文件,既然我们需要token验证,所以就需要导入token认证

from rest_framework.views import APIView
from django.http import JsonResponse
from rest_framework.authentication import BasicAuthentication, TokenAuthentication
from rest_framework.permissions import IsAuthenticated

# Create your views here.

class CartView(APIView):
    # 基于什么登录认证的
    authentication_classes = [BasicAuthentication, TokenAuthentication]  #支持token认证
    # 只有登录才能访问
    permission_classes = [IsAuthenticated]
    def get(self, request, *args, **kwargs):

        ....
        return JsonResponse(ctx)

3.2、传递方式

封装到请求头中,已下面的格式
Authorization: Token 401f7ac837da42b97f613d789819ff93537bee6a

缺点:token值在分布式系统中会有问题产生,并且没有过期时间,一旦被窃取,任何人都可以使用。

传递步骤:

1、POST方法请求http://127.0.0.1:8000/api-token-auth/ 获取token值。

 

 

2、我们看下 TokenAuthentication 的源码,看如何 传入 token值的。=> Ctrl + TokenAuthentication

class TokenAuthentication(BaseAuthentication):
    """
    Simple token based authentication.

    Clients should authenticate by passing the token key in the "Authorization"
    HTTP header, prepended with the string "Token ".  For example:

        Authorization: Token 401f7ac837da42b97f613d789819ff93537bee6a  #传token格式
    """

    .....

很明显:  传token的格式: Authorization: Token Toekn值。

3、我们访问GET请求:http://127.0.0.1:8000/api/cart/

说明:我们在请求header中:传入 Authorization: Token 877025d8e30491fbb00558c334d308f1cc7142d7(http://127.0.0.1:8000/api-token-auth/请求生成的token值)

 

4、请求错误的token值


免责声明!

本站转载的文章为个人学习借鉴使用,本站对版权不负任何法律责任。如果侵犯了您的隐私权益,请联系本站邮箱yoyou2525@163.com删除。



 
粤ICP备18138465号  © 2018-2025 CODEPRJ.COM