2013-07-09 30 views
30

我有一個django項目,使用django-rest-framework創建api。如何在django-rest-framework中使用TokenAuthentication用於API

想要使用令牌基礎認證系統,所以API調用(put,post,delete)只會爲授權用戶執行。

我安裝了'rest_framework.authtoken'併爲每個用戶創建了令牌。

因此,現在從django.contrib.auth.backends進行身份驗證,它將返回用戶,並將auth_token作爲屬性。 (當成功登入時)。

現在我的問題是如何發送帶有POST請求的令牌給我的API和 在API端如何驗證令牌是否有效並屬於正確的用戶?

應用程序rest_framework.authtoken中是否有任何方法來驗證給定的用戶及其令牌? 找不到this非常有用!

更新的變化(我做了): 增加這在我的settings.py:

REST_FRAMEWORK = { 
    'DEFAULT_AUTHENTICATION_CLASSES': (
     'rest_framework.authentication.BasicAuthentication', 
     'rest_framework.authentication.SessionAuthentication', 
     'rest_framework.authentication.TokenAuthentication', 
    ) 
} 

而且發送令牌在我的頭,但它仍然沒有工作:

if new_form.is_valid: 
    payload= {"createNewUser": 
       { "users": request.POST["newusers"], 
       "email": request.POST["newemail"] 
       } 
       } 

    headers = {'content-type' : 'application/json', 
       'Authorization': 'Token 6b929e47f278068fe6ac8235cda09707a3aa7ba1'} 

    r = requests.post('http://localhost:8000/api/v1.0/user_list', 
         data=json.dumps(payload), 
         headers=headers, verify=False) 
+0

基本上重複: http://stackoverflow.com/問題/ 14838128/django-rest-framework-token-authentication – jdero

+0

不能說那篇文章只談論創建令牌 - 我完成了這部分,現在想知道如何通過http請求傳遞令牌以及如何驗證給定用戶及其令牌。沒有人會談論那部分。 – Peter

+1

它在django-rest-framework文檔中有很好的文檔記錄。在客戶端,您只需向所有HTTP請求添加頭文件,並且django-rest-framework在服務器端執行其餘部分。如果提供了有效的標記,您將擁有正確的用戶作爲請求。用戶 – jasisz

回答

31

「如何我可以發送帶有POST請求的令牌給我的api「

從t他文檔...

對於客戶端進行身份驗證,令牌密鑰應包含在授權HTTP標頭中。關鍵字應以字符串文字「Token」爲前綴,用空格分隔兩個字符串。例如:「在API方面我如何可以驗證令牌是有效的,屬於正確的用戶」

Authorization: Token 9944b09199c62bcf9418ad846dd0e4bbdfc6ee4b 

你不需要做任何事,只是獲得request.user返回認證用戶 - REST框架將處理返回到任何不正確的驗證「401未授權」響應。

+1

如果請求被重定向,請確保該令牌在初始請求和隨後的重定向請求。 –

+0

「只需訪問request.user以返回經過身份驗證的用戶」。文檔說同樣的「返回響應(內容)」,但我已經返回我的觀點或任何我想顯示在API頁面。我怎麼能返回兩個? – Peter

+0

wow nevermind我追加'用戶':unicode(request.user)和'auth':unicode(request.auth)與我現有的回報和現在的工作。但是,我不得不重新粗略我的請求(auth_token),因爲我使用模板之間的重定向。謝謝大家 :) – Peter

1

我終於有了令牌認證的django「rest-auth」包。 如果這會有所幫助,這裏是客戶端的jQuery代碼爲我工作,你成功登錄並收到「AUTH_TOKEN」之後:

var user_url = {API URL}/rest-auth/login 
var auth_headers = { 
    Authorization: 'Token ' + auth_token 
} 
var user_ajax_obj = { 
    url : user_url, 
    dataType : 'json', 
    headers: auth_headers, 
    success : function(data) { 
    console.log('authorized user returned'); 
    }, 
    error: function(XMLHttpRequest, textStatus, errorThrown) { 
    console.log('error returned from ' + user_url); 
    } 
}; 
$.ajax(
    user_ajax_obj 
); 
3

要回答你的問題的前半部分:

我怎麼能與POST請求令牌發送給我的API

您可以使用Python requests庫。對於django的靜止框架TokenAuthentication,令牌需要由字符串Tokensee here)在頭部傳遞和前綴:

import requests 
mytoken = "4652400bd6c3df8eaa360d26560ab59c81e0a164" 
myurl = "http://localhost:8000/api/user_list" 

# A get request (json example): 
response = requests.get(myurl, headers={'Authorization': 'Token {}'.format(mytoken)}) 
data = response.json() 

# A post request: 
data = { < your post data >} 
requests.post(myurl, data=data, headers={'Authorization': 'Token {}'.format(mytoken)}) 
相關問題