使用django-rest-framework開發(fā)api并使用json web token進行身份驗證
在這里使用django-rest-framework-jwt這個庫來幫助我們簡單的使用jwt進行身份驗證
并解決一些前后端分離而產(chǎn)生的跨域問題
流程
安裝
安裝django-rest-framework
現(xiàn)在接口一般都是restful風格,所以我們直接使用這個框架
- 在終端輸入以下命令安裝
pip install djangorestframe
- 在settings.py的INSTALLED_APPS中加入:
INSTALLED_APPS = [
...
'rest_framework',
'rest_framework.authtoken', # 設(shè)置token
...
]
安裝django-rest-framework-jwt
安裝jwt庫艺沼,簡單快速的生成我們所需要的token
- 在終端輸入以下命令安裝:
pip install djangorestframework-jwt
- 在你的settings.py压固,添加JSONWebTokenAuthentication到Django REST框架DEFAULT_AUTHENTICATION_CLASSES
# django-rest-framework設(shè)置
REST_FRAMEWORK = {
'PAGE_SIZE': 10,
# 設(shè)置所有接口都需要被驗證
'DEFAULT_PERMISSION_CLASSES': (
'rest_framework.permissions.IsAuthenticated',
),
'DEFAULT_AUTHENTICATION_CLASSES': (
'rest_framework_jwt.authentication.JSONWebTokenAuthentication',
'rest_framework.authentication.SessionAuthentication',
'rest_framework.authentication.BasicAuthentication',
),
}
安裝django-cors-headers
解決api跨域請求有好幾種方法挫酿,比如(jsonp,在apache或nginx中設(shè)置,在請求頭里設(shè)置),我們這里使用這個包來方便的跨域
- 在終端輸入如下命令:
pip install django-cors-headers
2.配置settings.py文件
INSTALLED_APPS = [
...
'corsheaders'个榕,
...
]
MIDDLEWARE_CLASSES = (
...
'corsheaders.middleware.CorsMiddleware',
'django.middleware.common.CommonMiddleware', # 注意順序
...
)
CORS_ORIGIN_WHITELIST = (
#'*'
'127.0.0.1:8080',# 請求的域名
'localhost:8080',
'localhost',
)
配置
后端配置
- 在setting里設(shè)置token的過期時間
import datetime
JWT_AUTH = {
'JWT_EXPIRATION_DELTA': datetime.timedelta(seconds=300),
}
當然還有很多其他相關(guān)設(shè)置,可以自己翻閱文檔
- 修改使用jwt驗證的URL
from rest_framework_jwt.views import obtain_jwt_token
url(r'^api-token-auth/', obtain_jwt_token),
- 配置頁面訪問權(quán)限
按需設(shè)置訪問權(quán)限芥喇,加上token之后基本上是不經(jīng)過認證是不能查看或修改數(shù)據(jù)的
前端配置
(在前端我們使用jQuery封裝的ajax來操作get和post)
- 使用post方法獲取token并存入html的localStorage中
<script type="text/javascript">
function post_test() {
$.post("http://10.127.48.204:8000/api-token-auth/",{
'username':'earthchen',
'password':'xxxxxxxx'
},
function(result){
if(result){
localStorage.token=result.token; 存入數(shù)據(jù)
}
})
}
</script>
- 在請求數(shù)據(jù)時需要在頭部添加token
<script type="text/javascript">
function test(){
$.ajax({
headers:{
'Authorization':'JWT '+localStorage.token //注意:jwt后面有個空格
},
type:"get",
url:"http://10.127.48.204:8000/snippets/1/",
success:function(result){
document.write(result.style);
}
})
}
<script>
存入的token如圖所示
這時如果如果ajax請求不在head中帶上token那將被禁止請求西采,會產(chǎn)生如圖所示效果
所以在開發(fā)階段,我們先應不讓jwt攔截所有請求继控,這樣對我們測試產(chǎn)生諸多不變
注:
- 上述環(huán)境在ubuntu16.04 lts django1.9中搭建測試成功
- 上述文字皆為個人看法械馆,如有錯誤或建議請及時聯(lián)系我