2013-07-09 16 views
30

django-rest-frameworkを使用してapiを作成するdjangoプロジェクトがあります。django-rest-frameworkでAPI用TokenAuthenticationを使用する方法

トークンベース認証システムを使用したいので、(put、post、delete)のapi呼び出しは、許可されたユーザーに対してのみ実行されます。

私は 'rest_framework.authtoken'をインストールし、各ユーザーにトークンを作成しました。

これで、django.contrib.auth.backends authenticateから、属性としてauth_tokenを持つuserが返されます。 (正常にログインしたとき)。

私の質問はどのように私の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/ジャンゴ-静止フレームワークTokenAuthenticationため、トークン文字列Tokensee here)によりヘッダに渡され、前置される必要があります質問/ 14838128/django-rest-framework-token-authentication – jdero

+0

投稿はトークンの作成についてしか話しません - 私はその部分でやりましたが、httpリクエストでトークンを渡す方法と、与えられたユーザとそのトークン。その部分については身体的な話はしません。 – Peter

+1

これはdjango-rest-frameworkドキュメンテーションで非常によく書かれています。クライアント側では、すべてのHTTPリクエストにヘッダーを追加するだけで、django-rest-frameworkはサーバー側で残ります。有効なトークンが指定されていれば、request.userという正しいユーザーになります。 – jasisz

答えて

31

「どのように投稿後のトークンを私のAPIに送ることはできますか?

から彼はドキュメント...

クライアントが認証するためには、トークンキーが認証HTTPヘッダーに含まれる必要があります。キーには文字列リテラル "トークン"を接頭辞として使用し、2つの文字列を空白で区切る必要があります。たとえば:

Authorization: Token 9944b09199c62bcf9418ad846dd0e4bbdfc6ee4b 

「トークンが有効で、正しいユーザーに属している場合、API側では、どのように私は確認することができますか?」

あなただけの認証されたユーザーを返すようにrequest.userにアクセスし、何もする必要はありません - RESTフレームワークは間違っ認証に「401無許可の応答を返すに対処します。

+1

要求がリダイレクトされている場合は、トークンが最初の要求とその後のリダイレクト要求。 –

+0

"認証されたユーザーを返すためにrequest.userにアクセスする"。ドキュメントは同じ "返信応答(コンテンツ)"と言っていますが、私の見解や、私がapiページに表示したいものは何でも返しています。私は両方を返すことができますか? – Peter

+0

wow nevermind私は 'user'を追加しました:私の既存のリターンとその作業で、unicode(request.user)と 'auth':unicode(request.auth)。しかし、私はテンプレート間でリダイレクトを使用しているので、私は私の要求(auth_token)を再度ラフしなければなりませんでした。みんなに感謝:) – Peter

1

私は最終的にdjango "rest-auth"パッケージをトークン認証のために使用しています。 このことができます場合は、正常にログインし、「auth_token」を受信した後、ここに私のために働いた、クライアント側のjQueryのコードは、次のとおりです。

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

あなたの質問の最初の半分に答えるために:

あなたは、Python requestsライブラリを使用することができますどのように私は私のAPIにPOSTリクエストでトークンを送信することができます

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)}) 
関連する問題