如何在 django-rest-framework 中为 API 使用 TokenAuthentication

     2023-02-24     63

关键词:

【中文标题】如何在 django-rest-framework 中为 API 使用 TokenAuthentication【英文标题】:How to use TokenAuthentication for API in django-rest-framework 【发布时间】:2013-07-07 18:26:11 【问题描述】:

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

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

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

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

现在我的问题是如何将带有 post 请求的令牌发送到我的 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)

【问题讨论】:

基本上是重复的:***.com/questions/14838128/… 没有那个帖子只谈论创建令牌 - 我已经完成了那部分,现在想知道如何通过 http 请求传递令牌以及如何验证给定用户及其令牌。没有人谈论那部分。 它在 django-rest-framework 文档中有很好的记录。在客户端,您只需将标头添加到所有 HTTP 请求,django-rest-framework 在服务器端完成其余工作。如果提供了有效的令牌,您将拥有正确的用户 request.user 您需要对象级别的权限(经过身份验证的用户可以 POST/DELETE 自己的模型实例)还是只需要请求级别的权限(经过身份验证的用户可以执行任何 DELETE/POST)? 只是请求级别(经过身份验证的用户可以执行任何 DELETE/POST)并且我正在检查 request.user.is_staff 与否 【参考方案1】:

“如何将令牌与 post 请求一起发送到我的 api”

来自文档...

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

Authorization: Token 9944b09199c62bcf9418ad846dd0e4bbdfc6ee4b

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

您无需执行任何操作,只需访问 request.user 即可返回经过身份验证的用户 - REST 框架将处理对任何不正确的身份验证返回“401 Unauthorized”响应。

【讨论】:

如果请求被重定向,请确保在初始请求和后续重定向请求中都发送令牌。 "只需访问 request.user 即可返回经过身份验证的用户"。文档说相同的“返回响应(内容)”,但我已经返回我的视图或我想在 api 页面中显示的任何内容。我怎样才能同时返回? 哇,没关系,我在现有的回报中附加了 'user': unicode(request.user) 和 'auth': unicode(request.auth) 并且现在可以使用。但是你我不得不重新粗略我的请求(auth_token),因为我在模板之间使用重定向。谢谢大家:)【参考方案2】:

回答你问题的前半部分:

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

您可以使用 Python requests 库。对于django-rest-framework TokenAuthentication,token需要在header中传入,并以字符串Token(see here)为前缀:

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】:

我终于有了用于令牌认证的 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
);

【讨论】:

【参考方案4】:

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

【讨论】:

如何使用 TemplateHTMLRenderer 在 Django-REST-Framework 中创建/放置?

】如何使用TemplateHTMLRenderer在Django-REST-Framework中创建/放置?【英文标题】:HowdoIuseTemplateHTMLRendererforCreate/PutinDjango-REST-Framework?【发布时间】:2019-04-1512:45:20【问题描述】:我很难找到正确的方法来初始化TemplateHTMLRenderer以呈现用... 查看详情

如何在 React 中显示来自 django-rest-framework 的错误消息

】如何在React中显示来自django-rest-framework的错误消息【英文标题】:Howtodisplayerrormessagesfromdjango-rest-frameworkinReact【发布时间】:2019-12-2910:24:11【问题描述】:我正在尝试使用Django休息框架和反应,redux来实现用户注册表单。我能... 查看详情

如何使 DRF ( Django-REST-Framework) 令牌保持不变,使其在每次页面刷新后不会丢失?

】如何使DRF(Django-REST-Framework)令牌保持不变,使其在每次页面刷新后不会丢失?【英文标题】:HowtomaketheDRF(Django-REST-Framework)Tokenpersistsothatitdoesnotgetlostaftereachpagerefresh?【发布时间】:2019-12-2820:31:36【问题描述】:注意——我没有... 查看详情

django-rest-framework 和 swagger api 文档

】django-rest-framework和swaggerapi文档【英文标题】:django-rest-frameworkandswaggerapidocumentation【发布时间】:2014-06-0504:47:24【问题描述】:我查看了django-rest-swagger项目,我想用它来为我的项目记录api。但是如何做到这一点存在一些问题... 查看详情

django-rest-framework: api 版本控制

】django-rest-framework:api版本控制【英文标题】:django-rest-framework:apiversioning【发布时间】:2012-12-2512:52:55【问题描述】:谷歌搜索似乎普遍认为,在RESTURI中嵌入版本号是一种不好的做法和一个坏主意。即使在SO上,也有强烈的支持... 查看详情

django-rest-framework 如何使模型序列化器字段成为必需

】django-rest-framework如何使模型序列化器字段成为必需【英文标题】:django-rest-frameworkhowtomakemodelserializerfieldsrequired【发布时间】:2015-09-0608:12:41【问题描述】:我有一个模型,我正在一步一步填写,这意味着我正在制作一个表单... 查看详情

django-rest-framework:如何序列化已经包含 JSON 的字段?

】django-rest-framework:如何序列化已经包含JSON的字段?【英文标题】:django-rest-framework:HowDoISerializeaFieldThatAlreadyContainsJSON?【发布时间】:2014-04-0501:41:03【问题描述】:我对django-rest-framework还是很陌生,所以需要一些帮助。我有一... 查看详情

使用 django-rest-framework 创建对象后返回 id 值

】使用django-rest-framework创建对象后返回id值【英文标题】:Returningidvalueafterobjectcreationwithdjango-rest-framework【发布时间】:2013-09-1920:32:03【问题描述】:我正在使用django-rest-framework通用视图通过POST请求在模型中创建对象。我想知道... 查看详情

django-rest-framework 令牌认证和注销

】django-rest-framework令牌认证和注销【英文标题】:django-rest-frameworkTokenAuthandlogout【发布时间】:2015-03-0707:21:07【问题描述】:据了解,obtain_auth_token视图用作登录功能。您提供凭据并取回令牌。什么会注销?我应该在注销时删除... 查看详情

如何使用 django-rest-framework 进行社交登录? [关闭]

】如何使用django-rest-framework进行社交登录?[关闭]【英文标题】:Howexactlyworkasocialloginwithdjango-rest-framework?[closed]【发布时间】:2015-11-2916:50:57【问题描述】:我需要创建一个Web服务来登录用户。此Web服务将从Android或iOS应用程序调... 查看详情

如何更改 django-rest-framework 的 authtoken 中的现有令牌?

】如何更改django-rest-framework的authtoken中的现有令牌?【英文标题】:HowcanIchangeexistingtokenintheauthtokenofdjango-rest-framework?【发布时间】:2014-01-0803:31:50【问题描述】:保存失败:fromrest_framework.authtoken.modelsimportTokentoken=Token.objects.get 查看详情

如何仅使用 django 作为后端并使用 django-rest-framework 发布

】如何仅使用django作为后端并使用django-rest-framework发布【英文标题】:Howtousedjangoonlyabackendandpostwithdjango-rest-framework【发布时间】:2016-11-2712:06:00【问题描述】:我将只使用Django作为后端。前端将使用React完成,没有django模板。我... 查看详情

django-rest-framework:如何更新嵌套的外键?我的更新方法甚至没有被调用

】django-rest-framework:如何更新嵌套的外键?我的更新方法甚至没有被调用【英文标题】:django-rest-framework:howdoIupdateanestedforeignkey?Myupdatemethodisnotevencalled【发布时间】:2022-01-2202:43:18【问题描述】:我有这样的东西(我只包括了相... 查看详情

如何从 django-rest-framework 中的文件列表中过滤图像

】如何从django-rest-framework中的文件列表中过滤图像【英文标题】:howtofilterimagesfromalistoffilesindjango-rest-framework【发布时间】:2021-09-2014:57:31【问题描述】:我有一个Django休息服务器,它提供一个文件列表来响应前端。我想知道我... 查看详情

在 django-rest-framework 中捕获参数

】在django-rest-framework中捕获参数【英文标题】:Captureparametersindjango-rest-framework【发布时间】:2014-02-1302:01:42【问题描述】:假设这个网址:http://localhost:8000/articles/1111/comments/我想获取给定文章的所有cmets(此处为1111)。这就是... 查看详情

在视图集中创建的 Django-rest-framework 权限

】在视图集中创建的Django-rest-framework权限【英文标题】:Django-rest-frameworkpermissionsforcreateinviewset【发布时间】:2014-05-1017:03:02【问题描述】:我正在尝试创建一个RESTAPI并且卡在用户注册上:基本上我需要在注册之前获得访问令牌... 查看详情

如何使用 django-rest-framework 测试客户端测试二进制文件上传?

】如何使用django-rest-framework测试客户端测试二进制文件上传?【英文标题】:HowcanItestbinaryfileuploadingwithdjango-rest-framework\'stestclient?【发布时间】:2014-08-0319:09:15【问题描述】:我有一个Django应用程序,其视图接受要上传的文件。... 查看详情

如何使用 Django-oauth-toolkit 使用 Django-rest-framework 测试 API 端点以进行身份​​验证

】如何使用Django-oauth-toolkit使用Django-rest-framework测试API端点以进行身份​​验证【英文标题】:HowtotestanAPIendpointwithDjango-rest-frameworkusingDjango-oauth-toolkitforauthentication【发布时间】:2015-02-2220:31:33【问题描述】:我有一个Django-rest-fr... 查看详情