2016-07-30 55 views
1

我想構建一個用戶可以使用令牌進行身份驗證的休息api。我在已安裝的應用程序列表中包含了rest_framework.authtoken。還增加了所需的配置在settings.py:如何使用django rest框架和ajax獲取令牌

INSTALLED_APPS = (
    ... 
    'rest_framework.authtoken' 
) 

REST_FRAMEWORK = { 
    'DEFAULT_PERMISSION_CLASSES': (
     'rest_framework.permissions.IsAuthenticated', 
    ), 
    'DEFAULT_AUTHENTICATION_CLASSES': (
     'rest_framework.authentication.TokenAuthentication', 
     'rest_framework.authentication.SessionAuthentication', 
    ) 
} 

中定義的方法來聽post_save信號和用於新創建的用戶創建新的令牌。然後我做了遷移。創建新用戶後,我可以看到該用戶的令牌。

另外,如果我做

http POST 0.0.0.0:80/api-token-auth/ username='[email protected]' password='secure123' 

我得到這個迴響應

HTTP/1.0 200 OK 
Allow: POST, OPTIONS 
Content-Type: application/json 
Date: Sat, 30 Jul 2016 12:05:30 GMT 
Server: WSGIServer/0.1 Python/2.7.3 
Vary: Cookie 
X-Frame-Options: SAMEORIGIN 

{ 
    "token": "4aecfb249265064c55300d782e4c7e66b8b77063" 
} 

,所以我想它的工作。但是,如果我嘗試用AJAX登錄:

$.ajax({ 
    url: 'http://test.com/api-token-auth/ username=' + email + ' password='+ password, 
    dataType: 'json', 
    cache: false, 
    success: function(data) { 
     console.log(data); 
    }.bind(this), 
    error: function(xhr, status, err) { 
     console.log(err); 
    }.bind(this) 
}); 

我得到這個錯誤在瀏覽器控制檯:

jquery-3.1.0.min.js:4 GET http://test.com/api-token-auth/%[email protected]%20password=secure123?_=1469883569618 405 (Method Not Allowed)

bundle.js:27453 Method Not Allowed

如何獲得的令牌身份驗證的用戶,這樣我可以用它來發布的經過認證的用戶?

更新

我也是用django-cors-headers來處理有關問題CORS。

更新

%[email protected]%20password=secure123?_=1469885103431 405 xhr jquery-3.1.0.min.js:4 278 B 29 ms 

更新:加入響應頭

enter image description here

+0

從瀏覽器的網絡通信提供的詳細信息,在Chrome中你會發現它在調試器的網絡選項卡 – schacki

+0

@schacki添加細節。請看一看。 –

+0

%20表示空格,在你的ajax請求中用'?username'和'password'替換'username'爲'&password'。另外我記得這也需要'&grant_type = password'參數。請求網址中不能有空格('')。 –

回答

0

默認情況下,typemethod值被設置爲上jQuery.ajax 'GET'()方法。它看起來像你得到的迴應,只允許'POST'和'OPTIONS'。

您如何嘗試將typemethod值設置爲jQuery.ajax()方法中的'POST'。

+0

我添加'method ='POST''後,出現此錯誤:'jquery-3.1.0.min.js:4 POST http://test.com/api-token-auth/%20username=user @ gmail.com%20password = secure123 400(壞請求)' –

+0

你可以通過響應頭嗎? – an0o0nym

+0

用響應頭更新了問題。請看一看。 –

0

這是一個CORS問題,請嘗試用鉻和鉻瀏覽器 - 禁用網絡安全啓動它來測試它

0

這裏的問題是,因爲不是將數據發送到請求的有效載荷,你正在通過URL傳遞,就像GET請求一樣。

您將使用httpie的作品,因爲它正確生成請求,因爲你可以看到請求:

請求:

http POST 0.0.0.0:80/api-token-auth/ username='[email protected]' password='secure123' 

請求(詳細模式):

POST /api-token-auth/ HTTP/1.1 
Accept: application/json 
Accept-Encoding: gzip, deflate 
Connection: keep-alive 
Content-Length: 55 
Content-Type: application/json 
Host: 0.0.0.0:8000 
User-Agent: HTTPie/0.9.3 

{ 
    "password": "secure123", 
    "username": "[email protected]" 
} 

不同於:

請求:

http POST "0.0.0.0:8000/api-token-auth/ username='[email protected]' password='secure123'" 

請求(詳細模式):

POST /api-token-auth/%20username='[email protected]'%20password='secure123' HTTP/1.1 
Accept: */* 
Accept-Encoding: gzip, deflate 
Connection: keep-alive 
Content-Length: 0 
Host: 0.0.0.0:8000 
User-Agent: HTTPie/0.9.3 

你可以試試這個例子中,我發現瞭如何使用jQuery正確的方式發送數據here。 (我沒測試它。)

$.ajax({ 
    type: "POST", 
    url: "/api/articles/", 
    data: JSON.stringify(data), 
    sucess: function() { console.log("Success!"); }, 
    contentType: "application/json; charset=utf-8", 
    dataType: "json", 
    crossDomain:false, 
    beforeSend: function(xhr, settings) { 
     xhr.setRequestHeader("X-CSRFToken", csrftoken); 
    } 
}); 
相關問題