zoukankan      html  css  js  c++  java
  • 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的用户

  • 相关阅读:
    随笔2
    随笔
    关于updateElement接口
    随笔1
    本地访问正常,服务器访问乱码 记录
    Redis (error) NOAUTH Authentication required.解决方法
    tomcat启动很慢 停留在 At least one JAR was scanned for TLDs yet contained no TLDs.
    微信公众号消息回复
    微信公众号 报token验证失败
    idea中web.xml报错 Servlet should have a mapping
  • 原文地址:https://www.cnblogs.com/liushui0306/p/13124250.html
Copyright © 2011-2022 走看看