Подтвердить что ты не робот

Как использовать TokenAuthentication для API в django-rest-framework

У меня есть проект django, используя django-rest-framework для создания api.

Хотите использовать систему аутентификации на основе токена, поэтому api-вызов (put, post, delete) будет выполняться только для авторизованного пользователя.

Я установил 'rest_framework.authtoken' и создал токен для каждого пользователя.

Итак, теперь из django.contrib.auth.backends authenticate, он возвращает пользователя, с атрибутом auth_token. (при успешном входе в систему).

Теперь мой вопрос заключается в том, как я могу отправить токен с почтовым запросом на 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)
4b9b3361

Ответ 1

"как я могу отправить токен с почтовым запросом на мой api"

Из документов...

Для аутентификации клиентов ключ маркера должен быть включен в HTTP-заголовок авторизации. Ключ должен иметь префикс строкового литерала "Токен" с пробелом, разделяющим две строки. Например:

Authorization: Token 9944b09199c62bcf9418ad846dd0e4bbdfc6ee4b

"на стороне api, как я могу проверить, является ли токен действительным и принадлежит правильному пользователю?"

Вам не нужно ничего делать, просто войдите в request.user, чтобы вернуть аутентифицированного пользователя. Структура REST будет обрабатывать ответ "401 Unauthorized" на любую неверную проверку подлинности.

Ответ 2

Чтобы ответить на первую половину вопроса:

как я могу отправить токен с почтовым запросом на api

Вы можете использовать библиотеку Python requests. Для 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)})

Ответ 3

Наконец, у меня есть пакет 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
);