最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

django基于存儲在前端的token用戶認(rèn)證解析

 更新時(shí)間:2019年08月06日 14:51:03   作者:Maple_feng  
這篇文章主要介紹了django基于存儲在前端的token用戶認(rèn)證解析,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下

一.前提

首先是這個(gè)代碼基于前后端分離的API,我們用了django的framework模塊,幫助我們快速的編寫restful規(guī)則的接口

前端token原理:

把(token=加密后的字符串,key=name)在登入后發(fā)到客戶端,以后客戶端再發(fā)請求,會攜帶過來服務(wù)端截取(token=加密后的字符串,key=name),我們再利用解密方法,將token和key進(jìn)行解碼,然后進(jìn)行比對,成功就是登入過的認(rèn)證,失敗就是沒有登入過的

還有一種方式,把{name:maple,id:1} 用我自己知道的加密方式加密之后變成了:加密字符串,加密字符串|{name:maple,id:1} 當(dāng)做token,發(fā)到客戶端,以后客戶端再發(fā)請求,會攜帶,加密字符串|{name:maple,id:1}過來,服務(wù)端截取{name:maple,id:1},再用我們的加密方式加密:加密字符串,拿到加密后的字符串進(jìn)行比對,這種方式,只要寫一個(gè)密碼函數(shù)就可以了,無需寫解密函數(shù)

二.token加密與解密

在django的app中定義個(gè)token模塊

將有關(guān)token的函數(shù)都放在里面,后面要用到,都調(diào)用這個(gè)模塊

加密token函數(shù):

import time
import base64
import hmac
def get_token(key, expire=3600):
  '''
  :param key: str (用戶給定的key,需要用戶保存以便之后驗(yàn)證token,每次產(chǎn)生token時(shí)的key 都可以是同一個(gè)key)
  :param expire: int(最大有效時(shí)間,單位為s)
  :return: token
  '''
  ts_str = str(time.time() + expire)
  ts_byte = ts_str.encode("utf-8")
  sha1_tshexstr = hmac.new(key.encode("utf-8"),ts_byte,'sha1').hexdigest()
  token = ts_str+':'+sha1_tshexstr
  b64_token = base64.urlsafe_b64encode(token.encode("utf-8"))
  return b64_token.decode("utf-8")

解密函數(shù):

def out_token(key, token):
  '''
  :param key: 服務(wù)器給的固定key
  :param token: 前端傳過來的token
  :return: true,false
  '''
  # token是前端傳過來的token字符串
  try:
    token_str = base64.urlsafe_b64decode(token).decode('utf-8')
    token_list = token_str.split(':')
    if len(token_list) != 2:
      return False
    ts_str = token_list[0]
    if float(ts_str) < time.time():
      # token expired
      return False
    known_sha1_tsstr = token_list[1]
    sha1 = hmac.new(key.encode("utf-8"),ts_str.encode('utf-8'),'sha1')
    calc_sha1_tsstr = sha1.hexdigest()
    if calc_sha1_tsstr != known_sha1_tsstr:
      # token certification failed
      return False
    # token certification success
    return True
  except Exception as e:
    print(e)

三.視圖CBV

登入函數(shù):

from rest_framework.response import Response
from rest_framework.views import APIView
from app01 import models
# get_token生成加密token,out_token解密token
from app01.token_module import get_token,out_token
class AuthLogin(APIView):
  def post(self,request):
    response={"status":100,"msg":None}
    name=request.data.get("name")
    pwd=request.data.get("pwd")
    print(name,pwd)
    user=models.User.objects.filter(username=name,password=pwd).first()
    if user:
      # token=get_random(name)
      # 將name進(jìn)行加密,3600設(shè)定超時(shí)時(shí)間
      token=get_token(name,60)
      models.UserToken.objects.update_or_create(user=user,defaults={"token":token})
      response["msg"]="登入成功"
      response["token"]=token
      response["name"]=user.username
    else:
      response["msg"]="用戶名或密碼錯(cuò)誤"
    return Response(response)

登入后訪問函數(shù):

from rest_framework.views import APIView
from app01 import models
from app01.serialize_module import BookSerialize
from app01.authentication_module import TokenAuth1,TokenAuth2
class Books(APIView):
  authentication_classes = [TokenAuth2]
  def get(self,request):
    response = {"status": 100, "msg": None}
    book_list=models.Book.objects.all()
    book_ser = BookSerialize(book_list, many=True)
    response["books"]=book_ser.data
    return Response(response)

路由:

from django.conf.urls import url
from django.contrib import admin
from app01 import views
urlpatterns = [
  url(r'^admin/', admin.site.urls),
  url(r'^books/$', views.Books.as_view()),
  url(r'^login/$', views.AuthLogin.as_view()),
]

四.framework認(rèn)證功能

from rest_framework.authentication import BaseAuthentication
from app01 import models
from rest_framework.exceptions import NotAuthenticated
# get_token生成加密token,out_token解密token
from app01.token_module import get_token,out_token
# 存儲在前端的token解密比對
class TokenAuth2(BaseAuthentication):
  def authenticate(self,request):
    token=request.GET.get("token")
    name=request.GET.get("name")
    token_obj=out_token(name,token)
    if token_obj:
      return
    else:
      raise NotAuthenticated("你沒有登入")

五.利用postman軟件在前端提交

登入POST請求:

返回結(jié)果:

訪問get請求:

以上就是本文的全部內(nèi)容,希望對大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。

相關(guān)文章

  • Python數(shù)據(jù)分析必備的12種數(shù)據(jù)清洗技術(shù)分享

    Python數(shù)據(jù)分析必備的12種數(shù)據(jù)清洗技術(shù)分享

    數(shù)據(jù)清洗是數(shù)據(jù)分析的第一步,它的好壞直接影響到后續(xù)分析的準(zhǔn)確性和可靠性,下面我們將詳細(xì)介紹 12 種常見的數(shù)據(jù)清洗技術(shù),大家可以根據(jù)需要進(jìn)行選擇
    2025-09-09
  • Python eval的常見錯(cuò)誤封裝及利用原理詳解

    Python eval的常見錯(cuò)誤封裝及利用原理詳解

    這篇文章主要介紹了Python eval的常見錯(cuò)誤封裝及利用原理詳解,小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧
    2019-03-03
  • Python實(shí)現(xiàn)圖片查找輪廓、多邊形擬合、最小外接矩形代碼

    Python實(shí)現(xiàn)圖片查找輪廓、多邊形擬合、最小外接矩形代碼

    這篇文章主要介紹了Python實(shí)現(xiàn)圖片查找輪廓、多邊形擬合、最小外接矩形代碼,具有很好的參考價(jià)值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2020-07-07
  • Python類的詳細(xì)定義與使用案例(實(shí)例講解)

    Python類的詳細(xì)定義與使用案例(實(shí)例講解)

    這篇文章主要給大家介紹了關(guān)于Python類的詳細(xì)定義與使用案例的相關(guān)資料,在Python中類表示具有相同屬性和方法的對象的集合,文中通過代碼介紹的非常詳細(xì),需要的朋友可以參考下
    2023-10-10
  • 如何利用python實(shí)現(xiàn)列表嵌套字典取值

    如何利用python實(shí)現(xiàn)列表嵌套字典取值

    這篇文章主要介紹了如何利用python實(shí)現(xiàn)列表嵌套字典取值,首先通過將列表backup_unit_id全部提取出來,確定需要取值的對象展開文章內(nèi)容,感興趣的朋友可以看一下
    2022-06-06
  • python特殊字符作為字符串不轉(zhuǎn)義的問題

    python特殊字符作為字符串不轉(zhuǎn)義的問題

    這篇文章主要介紹了python特殊字符作為字符串不轉(zhuǎn)義的問題,具有很好的參考價(jià)值,希望對大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2023-07-07
  • python 自動提交和抓取網(wǎng)頁

    python 自動提交和抓取網(wǎng)頁

    最近在研究怎么樣做個(gè)自動發(fā)帖器,要完成這個(gè)工具難度蠻大的,驗(yàn)證碼就是一個(gè)大問題(還沒有想到解決辦法哦,不管了),先要解決的是如何抓取,分析和提交頁面的問題。
    2009-07-07
  • python計(jì)算日期之間的放假日期

    python計(jì)算日期之間的放假日期

    這篇文章主要為大家詳細(xì)介紹了python計(jì)算日期之間的放假日期,實(shí)現(xiàn)自動查詢節(jié)日,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2018-06-06
  • Python字符串與正則表達(dá)式詳細(xì)介紹

    Python字符串與正則表達(dá)式詳細(xì)介紹

    這篇文章主要介紹了Python字符串與正則表達(dá)式,Python字符串與正則表達(dá)式在Python中具有非常重要的地位,熟練的使用字符串與正則表達(dá)式能夠?yàn)槲覀兊腜ython編程提供很多的便利之處,希望您閱讀完本文后能夠有所收獲
    2022-01-01
  • Python去除列表中重復(fù)元素的方法

    Python去除列表中重復(fù)元素的方法

    這篇文章主要介紹了Python去除列表中重復(fù)元素的方法,實(shí)例分析了Python中去除列表重復(fù)元素的使用技巧,需要的朋友可以參考下
    2015-03-03

最新評論

漠河县| 鄄城县| 右玉县| 札达县| 甘南县| 灯塔市| 泸定县| 紫阳县| 左权县| 鄂托克旗| 广德县| 玉溪市| 尼玛县| 武定县| 什邡市| 寿光市| 宣化县| 宁安市| 青铜峡市| 青浦区| 本溪市| 乌兰县| 彭山县| 奈曼旗| 云南省| 高唐县| 灵川县| 黄浦区| 德格县| 永济市| 淮南市| 马关县| 永昌县| 繁峙县| 株洲市| 额敏县| 洛隆县| 兰州市| 北宁市| 德惠市| 长宁区|