35

我有一个 django 项目,使用 django-rest-framework 创建 api。

想要使用基于令牌的身份验证系统,因此(放置、发布、删除)的 api 调用只会为授权用户执行。

我安装了“rest_framework.authtoken”并为每个用户创建了令牌。

因此,现在从 django.contrib.auth.backends 进行身份验证,它返回用户,以 auth_token 作为属性。(成功登录时)。

现在我的问题是如何将带有 post 请求的令牌发送到我的 api 以及在 api 端如何验证令牌是否有效并且属于正确的用户?

应用程序 rest_framework.authtoken 中是否有任何方法可以验证给定用户及其令牌?没发现这个很有用!

更新(我所做的更改):在我的 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)
4

4 回答 4

36

“我如何将带有发布请求的令牌发送到我的 api”

从文档...

对于客户端进行身份验证,令牌密钥应包含在 Authorization HTTP 标头中。键应以字符串文字“Token”为前缀,用空格分隔两个字符串。例如:

Authorization: Token 9944b09199c62bcf9418ad846dd0e4bbdfc6ee4b

“在 api 端,我如何验证令牌是否有效并且属于正确的用户?”

您不需要做任何事情,只需访问request.user以返回经过身份验证的用户 - REST 框架将处理对任何不正确的身份验证返回“401 Unauthorized”响应。

于 2013-07-10T11:22:32.997 回答
4

要回答您问题的前半部分:

如何将带有 post 请求的令牌发送到我的 api

您可以使用 Python请求库。对于 django-rest-framework TokenAuthentication,令牌需要在标头中传递并以字符串为前缀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)})
于 2016-03-31T12:10:55.987 回答
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
);
于 2015-08-25T06:46:00.353 回答
0

如果您使用的是 coreapi。添加你做的授权 import coreapi auth = coreapi.auth.TokenAuthentication(scheme='Token', token=token_key) 然后你可以做 client = coreapi.Client(auth=auth) response = client.get(my_url)

于 2019-01-02T06:02:54.140 回答