周波数源カテゴリ
方法でDispath 1 APIViewのself.initial(要求、*引数、** kwargsから)点に 2 self.check_throttles(要求) #の周波数検証 #のコアソースコード解析の周波数成分 DEFのcheck_throttles(セルフ、要求): throttle_durations = [] #1トラバース周波数ベースの認証設定、周波数認証初期化はクラスオブジェクトを取得(クラスが認証周波数__init __()メソッドを呼び出す) #認証方法allow_request 2周波数クラスオブジェクトコールは(制限時間か否かを判断します制限時間アクセシビリティ、限られた時間のアクセス不可) #再び、限られた時間の後に3周波数認定クラスオブジェクトにアクセスすることができ、時間の次の期間のために長く待つ必要が得るために待つメソッドを呼び出していない #周波数の認定クラスを派生さSimpleRateThrottlesクラス についてスロットルでself.get_throttles(): IF ないthrottle.allow_request(要求、セルフ) #只要频率限制了、allow_request返回偽了、才会调用待つ throttle_durations.append(throttle.wait()) の場合throttle_durations: 期間は = [ 期間のための期間でthrottle_durationsを 場合は期間があり ませんなし] 期間 = MAX(期間、デフォルト= なし) self.throttled(リクエスト、持続時間)
周波数カスタムクラス:
1 周波数クラスの継承カスタムSimpleRateThrottleクラス。 2 スコープタイプ属性を設定しますが、値が任意のビュー名の文字列に知られている意味属性 設定ファイルに3.設定を、フォーマット文字列{スコープDRF設定DEFAULT_THROTTLE_RATES:[ 回/時間の数' } 4 。カスタム周波数オーバーライドget_cache_key方法でクラス #のオブジェクトが制限を戻し、制限が関連情報文字列 #1 オブジェクト戻りなし(のみバックなしに、虚偽またはません限定するものではありません')など、'
SMSインターフェース1 /分の周波数限界
周波数:API / throttles.py
rest_framework.throttling インポートSimpleRateThrottleの クラス:SMSRateThrottle(SimpleRateThrottle) スコープ = 「SMS 」 #提出リミットの電話番号を取得するための唯一の方法 DEFのget_cache_key(セルフ、リクエスト、ビュー): モバイル = request.query_params.get(「モバイル」) #何の電話番号なし、限界周波数をしない のIF ないモバイル: 戻らないなし #の操作キャッシュキーとして、文字列を複製するために戻って、動的に電話番号を変更することができ、かつ困難を リターン " スロットル_%(範囲)S _%(IDENT)S '%{ ' スコープ':self.scope、' IDENT 」:携帯電話}
構成:settings.py
DRF構成 REST_FRAMEWORKが = { #1 周波数限界設定 ' DEFAULT_THROTTLE_RATES ' { ' SMS ':' 1 /分。' } }
ビュー、views.py
スロットル。インポートSMSRateThrottleの クラスTestSMSAPIView(APIView): #部分的に配置された周波数の認証 throttle_classes = [SMSRateThrottle] DEF(セルフ、要求、* argsを、** GET kwargsからの): リターン APIResponse(0、' コードをゲット' ) DEF POST (自己、要求、* argsを、** kwargsから): リターン APIResponse(0、' POSTコードがゲット')
ルーティング:API / url.py
URL(R ' ^ SMS / $ '、views.TestSMSAPIView.as_view())
制限事項・インタフェース
だけで/ API / SMSは、/?モバイル= 特定の電話番号のインタフェースは、周波数の制限があります 。1. API / SMS / 無制限に送信したり、他のインタフェース 2.パケット提出のAPIモバイル/ アンリミテッドSMSインタフェース 3を。 (電話など)、モバイルではない無制限フィールド電話インターフェイスによって提出
図認証ルール
DRF分類
認証ルールの進化チャート
データベースセッション認証:非効率的
キャッシュ認証:効率的な
JWT認証:効率的な
キャッシュ認証:簡単に複雑ではありません
JWT認証:簡単に複雑な
JWTの認定
利点:
1 )各クライアント自身の記憶装置にトークンストアサーバートークン、サーバーのストレス小さなないでください 2 )サーバとストレージを検証トークン2つのアルゴリズムの問題であり、高効率認証が発行 3)アルゴリズム各クラスタサーバの低コストの同期を完了するためにプロジェクトクラスタ配置の、ルーティング完了(高い並行性に適応するために)
フォーマット:
1) jwt token采用三段式:头部.载荷.签名 2)每一部分都是一个json字典加密形参的字符串 3)头部和载荷采用的是base64可逆加密(前台后台都可以解密) 4)签名采用hash256不可逆加密(后台校验采用碰撞校验) 5)各部分字典的内容: 头部:基础信息 - 公司信息、项目组信息、可逆加密采用的算法 载荷:有用但非私密的信息 - 用户可公开信息、过期时间 签名:头部+载荷+秘钥 不可逆加密后的结果 注:服务器jwt签名加密秘钥一定不能泄露 签发token:固定的头部信息加密.当前的登陆用户与过期时间加密.头部+载荷+秘钥生成不可逆加密 校验token:头部可校验也可以不校验,载荷校验出用户与过期时间,头部+载荷+秘钥完成碰撞检测校验token是否被篡改
drf_jwt插件
官网
https://github.com/jpadilla/django-rest-framework-jwt
安装
>: pip3 install djangorestframework-jwt
登录- 签发token: api/urls.py
# ObtainJSONWebToken视图类就是通过username和password得到user对象然后签发token from rest_framework_jwt.views import ObtainJSONWebToken, obtain_jwt_token urlpatterns = [ # url(r'^jogin/$', ObtainJSONWebToken.as_view()), url(r'^jogin/$', obtain_jwt_token), ]
认证-校验token: 全局或局部配置drf_jwt的认证类
from rest_framework.views import APIView from utils.response import APIResponse # 必须登录后才能访问 - 通过了认证权限组件 from rest_framework.permissions import IsAuthenticated from rest_framework_jwt.authentication import JSONWebTokenAuthentication class UserDetail(APIView): authentication_classes = [JSONWebTokenAuthentication] # jwt-token校验request.user permission_classes = [IsAuthenticated] # 结合权限组件筛选掉游客 def get(self, request, *args, **kwargs): return APIResponse(results={'username': request.user.username})
路由与接口测试
# 路由 url(r'^user/detail/$', views.UserDetail.as_view()), # 接口:/api/user/detail/ # 认证信息:必须在请求头的 Authorization 中携带 "jwt 后台签发的token" 格式的认证字符串