web-dev-qa-db-ja.com

Django-rest-frameworkでAPIにTokenAuthenticationを使用する方法

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)
31
Peter

「APIに投稿リクエストでトークンを送信するにはどうすればよいですか」

ドキュメントから...

クライアントが認証するには、トークンキーをAuthorization HTTPヘッダーに含める必要があります。キーの前に文字列リテラル「トークン」を追加し、2つの文字列を空白で区切ります。例えば:

Authorization: Token 9944b09199c62bcf9418ad846dd0e4bbdfc6ee4b

「API側で、トークンが有効で正しいユーザーに属しているかどうかを確認するにはどうすればよいですか?」

何もする必要はありません。ただrequest.user認証済みユーザーを返す-RESTフレームワークは、不正な認証に対して「401 Unauthorized」応答を返すことに対処します。

33
Tom Christie

質問の前半に答えるには:

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)})
3
elke

最終的に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
);
1
Stefan Musarra

Coreapiを使用している場合。認可を追加するには、import coreapi auth = coreapi.auth.TokenAuthentication(scheme='Token', token=token_key)を実行します。その後、client = coreapi.Client(auth=auth) response = client.get(my_url)を実行できます

0
unlockme