dango框架学习:四十一.Token认证登录

前言

现在很多接口项目在登录的时候返回一个token,登录后的拿着这个token去访问访问登录之后的请求。
本篇使用djangorestframework框架写一个登陆的接口,登录成功后返回token。

TokenAuthentication

django rest framework权限和认证有四种方式:

  • BasicAuthentication 此身份验证方案使用HTTP基本身份验证,根据用户的用户名和密码进行签名。基本身份验证通常仅适用于测试
  • TokenAuthentication 此身份验证方案使用基于令牌的简单HTTP身份验证方案。令牌认证适用于客户端 - 服务器设置,例如本机桌面和移动客户端。
  • SessionAuthentication 此身份验证方案使用Django的默认会话后端进行身份验证。会话身份验证适用于与您的网站在同一会话上下文中运行的AJAX客户端。
  • RemoteUserAuthentication 此身份验证方案允许您将身份验证委派给Web服务器,该服务器设置REMOTE_USER 环境变量。

本篇讲TokenAuthentication这种认证方式,先安装对应的模块

pip install djangorestframework

在setting.py中加入配置参数

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

添加REST_FRAMEWORK项,rest_framework.authentication.TokenAuthentication上面说的第三种token认证的方式。

REST_FRAMEWORK = {
    'DEFAULT_AUTHENTICATION_CLASSES': (
        'rest_framework.authentication.BasicAuthentication',
        'rest_framework.authentication.SessionAuthentication',
        'rest_framework.authentication.TokenAuthentication',  # token认证
    )
}

同步数据库,生成authtoken_token表

python manage.py migrate

执行完成后,数据库里面就会多一张authtoken_token表

登录生成token案例

登录可以直接用django自带的User表,所以不需要重新设计表了,登录的账号就是User表的数据,先准备几个登录的账号,比如我的登录账号是test,密码是123456

views.py编辑登录的视图函数

from rest_framework.authtoken.models import Token
from django.http import HttpResponse, JsonResponse, HttpResponseRedirect
from django.contrib.auth import login,  logout, authenticate

class LoginViewSet(APIView):
    '''登录方法'''    
    def post(self, request, *args, **kwargs):        
        username = request.data.get('username')        
        password = request.data.get('password')        
        user = authenticate(username=username,                 
        password=password)       
        if not user: 
            return JsonResponse({"code": 0,                               
                                            "msg": "用户名或密码不对!"})        
        # 删除原有的Token        
        old_token = Token.objects.filter(user=user)       
        old_token.delete()        
        # 创建新的Token        
        token = Token.objects.create(user=user)        
        return JsonResponse({"code": 0,                           
                                         "msg": "login success!",                            
                                         "username": user.username,                             
                                          "token": token.key})
                                                         

urls.py设置访问地址

urlpatterns = [
    url(r'^api/v1/login/$', views.LoginViewSet.as_view()),
]

测试登录获取token

接着测试登录返回token的接口,使用post请求,请求类型Content-Type: application/json

响应结果:

 查看数据库auth_token表,存入对应·的·token值

 user_id对应auth_user表中id=13的用户

原文地址:https://www.cnblogs.com/liushui0306/p/13124250.html