Как использовать 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)
Ответы
Ответ 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
);