Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/348.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 如何在django rest框架中使用API的令牌身份验证_Python_Django_Django Authentication_Django Rest Framework - Fatal编程技术网

Python 如何在django rest框架中使用API的令牌身份验证

Python 如何在django rest框架中使用API的令牌身份验证,python,django,django-authentication,django-rest-framework,Python,Django,Django Authentication,Django Rest Framework,我有一个django项目,使用django rest框架创建api 希望使用令牌基身份验证系统,以便(put、post、delete)的api调用将仅对授权用户执行 我安装了“rest\u framework.authtoken”,并为每个用户创建了令牌 因此,现在从django.contrib.auth.backends authenticate返回user,属性为auth_令牌。(成功登录时) 现在我的问题是如何将带有post请求的令牌发送到我的api和 在api端,如何验证令牌是否有效以及

我有一个django项目,使用django rest框架创建api

希望使用令牌基身份验证系统,以便(put、post、delete)的api调用将仅对授权用户执行

我安装了“rest\u framework.authtoken”,并为每个用户创建了令牌

因此,现在从django.contrib.auth.backends authenticate返回user,属性为auth_令牌。(成功登录时)

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

app rest_framework.authtoken中是否有任何方法来验证给定用户及其令牌? 不觉得很有用

更新(我所做的更改): 在my 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)
“如何将带有post请求的令牌发送到我的api”

从文件中

对于要进行身份验证的客户端,令牌密钥应包含在授权HTTP头中。键的前缀应该是字符串文字“Token”,两个字符串之间用空格分隔。例如:

Authorization: Token 9944b09199c62bcf9418ad846dd0e4bbdfc6ee4b
“在api端,如何验证令牌是否有效以及是否属于正确的用户?”

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

我终于让django“REST auth”包用于令牌身份验证。 如果这有帮助,以下是成功登录并收到“auth_令牌”后为我工作的客户端jQuery代码:


回答问题的前半部分:

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

您可以使用Python库。对于django rest framework令牌身份验证,令牌需要在头中传递,并以字符串
token
()作为前缀:

导入请求
mytoken=“4652400bd6c3df8eaa360d26560ab59c81e0a164”
myurl=”http://localhost:8000/api/user_list"
#get请求(json示例):
response=requests.get(myurl,headers={'Authorization':'Token{}'。格式(mytoken)})
data=response.json()
#邮寄请求:
data={}
requests.post(myurl,data=data,headers={'Authorization':'Token{}'。格式(mytoken)})

如果您使用的是coreapi。添加您所做的授权

进口coreapi
auth=coreapi.auth.TokenAuthentication(scheme='Token',Token=Token\u key)
那你就可以了

client=coreapi.client(auth=auth)
response=client.get(我的url)

基本上是重复的:不,这篇文章只讨论创建令牌-我已经完成了这一部分,现在想知道如何通过http请求传递令牌,以及如何验证给定用户及其令牌。没有人谈论这一部分。django rest framework文档中对这一部分进行了详细的描述。在客户端,您只需向所有HTTP请求添加头,django rest framework在服务器端完成其余部分。如果提供了有效的令牌,您将拥有正确的用户作为请求。用户您是否需要对象级权限(经过身份验证的用户可以发布/删除其自己的模型实例)或只是请求级权限(经过身份验证的用户可以执行任何删除/发布)?只是请求级权限(经过身份验证的用户可以执行任何删除/发布)和Im检查request.user.is_staff与否如果请求被重定向,请确保令牌在初始请求和后续重定向请求中都被发送。“只需访问request.user即可返回经过身份验证的用户”。文档上说了同样的“返回响应(内容)”,但我已经返回了我的视图或我想在api页面中显示的任何内容。我怎样才能同时返回呢?哇,不用担心,我在现有的返回及其现在的工作状态中附加了“user”:unicode(request.user)和“auth”:unicode(request.auth)。但是我不得不重新处理我的请求(auth_令牌),因为我在模板之间使用重定向。谢谢大家:)
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
);
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)})