Djangoプロジェクトがあり、Django-rest-frameworkを使用してAPIを作成しています。
トークンベース認証システムを使用して、(put、post、delete)のapi呼び出しが許可ユーザーに対してのみ実行されるようにします。
「rest_framework.authtoken」をインストールし、ユーザーごとにトークンを作成しました。
したがって、Django.contrib.auth.backends認証から、auth_tokenを属性としてユーザーを返します。 (正常にログインした場合)。
ここで私の質問は、投稿リクエストでトークンを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)
「APIに投稿リクエストでトークンを送信するにはどうすればよいですか」
ドキュメントから...
クライアントが認証するには、トークンキーをAuthorization HTTPヘッダーに含める必要があります。キーの前に文字列リテラル「トークン」を追加し、2つの文字列を空白で区切ります。例えば:
Authorization: Token 9944b09199c62bcf9418ad846dd0e4bbdfc6ee4b
「API側で、トークンが有効で正しいユーザーに属しているかどうかを確認するにはどうすればよいですか?」
何もする必要はありません。ただrequest.user
認証済みユーザーを返す-RESTフレームワークは、不正な認証に対して「401 Unauthorized」応答を返すことに対処します。
質問の前半に答えるには:
aPIに投稿リクエストでトークンを送信するにはどうすればよいですか
Python requests ライブラリを使用できます。Django-rest-frameworkTokenAuthenticationの場合、トークンをヘッダーで渡し、接頭辞として文字列Token
( こちらを参照 ):
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)})
最終的に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
);
Coreapiを使用している場合。認可を追加するには、import coreapi auth = coreapi.auth.TokenAuthentication(scheme='Token', token=token_key)
を実行します。その後、client = coreapi.Client(auth=auth) response = client.get(my_url)
を実行できます