Django學習之REST framework JWT Auth

 

環境要求:html

Python(2.七、3.三、3.四、3.5)
Django(1.八、1.九、1.10)
Django REST framework(3.0、3.一、3.二、3.三、3.四、3.5)git


個人環境:github

Python 3.6
Django 1.11.11
Django REST framework 3.8.2算法


具體步驟django

1.安裝
pip install djangorestframework-jwtjson


2.配置
在settings 中將「JSONWebTokenAuthentication」,添加到 Django REST 框架中「DEFAULT_AUTHENTICATION_CLASSES」,以下:api

 1 # rest_framework settings
 2 REST_FRAMEWORK = {
 3 # REST framework Auth
 4 # 'DEFAULT_PERMISSION_CLASSES': (
 5 #    'rest_framework.permissions.IsAuthenticated',
 6 # ),
 7   'DEFAULT_AUTHENTICATION_CLASSES': (
 8   'rest_framework_jwt.authentication.JSONWebTokenAuthentication',
 9   'rest_framework.authentication.SessionAuthentication',
10   'rest_framework.authentication.BasicAuthentication',
11 ),
12 }

 

在users/urls.py 中添加url路由,以啓用使用用戶名和密碼經過POST獲取token安全

1 from rest_framework_jwt.views import obtain_jwt_token
2 urlpatterns = [
3   ...,
4   url(r'^auths/$', obtain_jwt_token, name='auths')
5 ]

 

測試使用用戶名test01 和密碼12345678 在終端中執行下面的操做來測試是否正常工做app

curl -X POST -d "username=test01&password=12345678" http://127.0.0.1:8000/users/auths/

也可使用另一種命令經過JSON數據 來請求獲取token框架

curl -X POST -H "Content-Type: application/json" -d '{"username":"test01","password":"12345678"}' http://127.0.0.1:8000/users/auths/

結果是同樣的
拿到這個token 後,就可使用這個token 去訪問受保護的資源了,可是必需要設置Authorization:JWT <your_tojen> 的請求頭信息

curl -H "Authorization: JWT <your_token>" http://127.0.0.1:8000/protected-url/

若是想了解更多的curl 命令,請查看 https://www.cnblogs.com/duhuo/p/5695256.html#4098907


其餘設置(根據自身需求在settings中設置JWT_AUTH)
如下爲全部可用的默認值

 1 JWT_AUTH = {
 2 'JWT_ENCODE_HANDLER':
 3 'rest_framework_jwt.utils.jwt_encode_handler',
 4 
 5 'JWT_DECODE_HANDLER':
 6 'rest_framework_jwt.utils.jwt_decode_handler',
 7 
 8 'JWT_PAYLOAD_HANDLER':
 9 'rest_framework_jwt.utils.jwt_payload_handler',
10 
11 'JWT_PAYLOAD_GET_USER_ID_HANDLER':
12 'rest_framework_jwt.utils.jwt_get_user_id_from_payload_handler',
13 
14 'JWT_RESPONSE_PAYLOAD_HANDLER':
15 'rest_framework_jwt.utils.jwt_response_payload_handler',
16 
17 'JWT_SECRET_KEY': settings.SECRET_KEY,
18 'JWT_GET_USER_SECRET_KEY': None,
19 'JWT_PUBLIC_KEY': None,
20 'JWT_PRIVATE_KEY': None,
21 'JWT_ALGORITHM': 'HS256',
22 'JWT_VERIFY': True,
23 'JWT_VERIFY_EXPIRATION': True,
24 'JWT_LEEWAY': 0,
25 'JWT_EXPIRATION_DELTA': datetime.timedelta(seconds=300),
26 'JWT_AUDIENCE': None,
27 'JWT_ISSUER': None,
28 
29 'JWT_ALLOW_REFRESH': False,
30 'JWT_REFRESH_EXPIRATION_DELTA': datetime.timedelta(days=7),
31 
32 'JWT_AUTH_HEADER_PREFIX': 'JWT',
33 'JWT_AUTH_COOKIE': None,
34 }

 

其中容許修改的選項有:


JWT_SECRET_KEY
這個是用於籤屬JWT 的密鑰,默認是使用項目的settings.SECRET_KEY,若是須要修改,需確保設置的是安全的,非公開的

JWT_GET_USER_SECRET_KEY
這個個JWT_SECRET_KEY 的更強大的版本。是根據用戶定義的,所以若是token 被泄露,可讓全部者輕鬆更改。更改此值將給定用戶的全部令牌都沒法使用。值是一個函數,接收用戶做爲惟一參數,並返回它的密鑰,默認是None

JWT_VERIFY
若是驗證密鑰是錯誤的,將會拋出一個DecodeError的錯誤,若是你還想得到荷載裏面的內容,能夠將這個值設置成False,默認是True

JWT_VERIFY_EXPIRATION
設置該值爲False 將會關閉過時驗證('JWT_EXPRIATION_DELTA'將無效),若是沒有過時驗證,JWT 將永遠存在,意味着攻擊者能夠無限期地使用泄露的令牌。默認爲True

JWT_LEEWAY
這容許您驗證過去但不是很遠的過時時間。 例如,若是您有一個JWT有效負載,其過時時間設置爲建立後30秒,但您知道有時您將在30秒後處理它,您能夠設置10秒的餘地以得到一些餘量。默認爲 0 秒

JWT_EXPIRATION_DELTA
值是Python 的一個datetime.timedelta 的實例對象。將添加datetime.utcnow() 來設置到期時間
默認是 datetime.timelta(seconds=300) (300秒,即5分鐘)

JWT_AUDIENCE
若是存在,值就是一個字符串,用來驗證JWT 裏的「aud」字段
默認是None (若是JWT 裏面存在aud 字段,此值使用默認值,則會驗證失敗)

JWT_ISSUER
若是存在,值就是一個字符串,用來驗證JWT 裏面的「iss」字段
默認是None(不建議在JWT 中設置此字段)

JWT_ALLOW_REFERSH
開啓令牌刷新功能,被「rest_framework_jwt.views.obtain_jwt_token」 簽發的令牌將會有一個「orig_iat」字段
默認是False 不刷新令牌

JWT_REFERSH_EXPIRATION_DELTA
刷新令牌的時間,也是一個datetime.timedelta 實例,指獲取原始令牌以後,刷新新令牌的間隔時間
默認爲 datetime.timedelta(days=7)(7天)

JWT_PAYLOAD_HANDLER
指定一個自定義的函數去生成令牌的荷載

JWT_PAYLOAD_GET_USER_ID_HANDLER
若是你存儲的user_id 方式與默認的有效負載處理程序不一樣,請實現此功能讓user_id 從有效負載中獲取
不建議使用 「JWT_PAYLOAD_GET_USERNAME_HANDLER」配置

JWT_PAYLOAD_GET_USERNAME_HANDLER
若是你存儲的username 方式與默認的有效負載處理程序不一樣,請實現此功能讓username 從有效負載中獲取

JWT_RESPONSE_PAYLOAD_HANDLER
負責控制登陸或刷新後響應返回的數據,能夠從新定義函數以覆蓋響應默認返回的內容,好比用戶的序列化表示:

1 def jwt_response_payload_handler(token, user=None, request=None):
2   return {
3     'token': token,
4     'user': UserSerializer(user, context={'request': request}.data
5   }

默認返回的是 {’token‘: token}

JWT_AUTH_HANDER_PREFIX
請求時,「Authorization」 請求頭字段值的前綴,默認是 JWT ,用於令牌請求的頭的另外一個常見的前綴使用的是「Bearer」

JWT_AUTH_COOKIE
若是你除了「Authorization」請求頭以外還要使用http Cookie 放到令牌做爲有效傳輸,你能夠在這設置一個字符串做爲Cookie 的名稱,這個名稱將在生成令牌時存在在響應頭,若是進行了設置,則令牌校驗請求的時候也會查看這個名稱。若是請求頭中同時存在這個Cookie 名稱和「Authorization」這兩個字段,將以「Authorization」 爲主要校驗手段。
默認是None ,建立令牌時使用默認值,則在驗證的時候也就接收請求中的Cookie 去驗證

 

手動建立新令牌
有時但願手動生成令牌,例如再建立帳戶後當即將令牌返回給用戶,能夠添加如下邏輯

1 from rest_framework_jwt.settings import api_settings
2 
3 jwt_payload_handler = api_settings.JWT_PAYLOAD_HANDLER
4 jwt_encode_handler = api_settings.JWT_ENCODE_HANDLER
5 payload = jwt_payload_handler(user)
6 token = jwt_encode_handler(payload)

 

不經常使用的設置


JWT_PUBLIC_KEY
這是一個類型的對象cryptography.hazmat.primitives.asymmetric.rsa.RSAPublicKey。它將用於驗證傳入JWT的簽名。JWT_SECRET_KEY設置時將覆蓋。閱讀文檔以獲取更多詳細信息。請注意,JWT_ALGORITHM必須設置爲一個RS256,RS384或RS512。
默認是None。

JWT_PRIVATE_KEY
這是一個類型的對象cryptography.hazmat.primitives.asymmetric.rsa.RSAPrivateKey。它將用於簽署JWT的簽名組件。JWT_SECRET_KEY設置時將覆蓋。閱讀文檔以獲取更多詳細信息。請注意,JWT_ALGORITHM必須設置爲一個RS256,RS384或RS512。
默認是None

JWT_ALGORITHM
可能的值是PyJWT中用於加密簽名的任何支持算法。
默認是"HS256"。

 

參考資料:http://getblimp.github.io/django-rest-framework-jwt/

相關文章
相關標籤/搜索