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

时间:2013-07-09 23:53:25

标签: python django django-authentication django-rest-framework

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

想要使用令牌基础认证系统,因此api调用(put,post,delete)只会为授权用户执行。

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

因此,现在从django.contrib.auth.backends进行身份验证,它将返回user,并将auth_token作为属性。 (成功时)。

现在我的问题是如何将带有发布请求的令牌发送到我的api和 在api方面,如何验证令牌是否有效并且属于正确的用户?

app 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)

3 个答案:

答案 0 :(得分:33)

  

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

来自文档...

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

Authorization: Token 9944b09199c62bcf9418ad846dd0e4bbdfc6ee4b
  

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

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

答案 1 :(得分:3)

回答你问题的前半部分:

  

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

您可以使用Python requests库。对于django-rest-framework TokenAuthentication,需要在标头中传递令牌,并以字符串Tokensee 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)})

答案 2 :(得分:0)

如果您正在使用coreapi。要添加授权,请执行 import coreapi auth = coreapi.auth.TokenAuthentication(scheme='Token', token=token_key) 那你可以做 client = coreapi.Client(auth=auth) response = client.get(my_url)