30

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

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

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

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

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

Есть ли методы в приложении rest_framework.authtoken для проверки данного пользователя и его токена? не найдено this Очень полезно!

Update (изменения, которые я сделал): Добавленного это в моем 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) 
+0

основном дубликат: http://stackoverflow.com/ questions/14838128/django-rest-framework-токен-аутентификация – jdero

+0

nop Этот пост только говорит о создании токенов - я закончил с этой частью, и теперь хочу знать, как передать токен через HTTP-запрос и как проверить данного пользователя и его токена. Ни одна из них не говорит об этой части. – Peter

+1

Это хорошо документировано в документации django-rest-framework. На стороне клиента вы просто добавляете заголовок ко всем HTTP-запросам, а django-rest-framework делает все остальное на стороне сервера. Если был предоставлен действительный токен, у вас будет правильный пользователь в качестве request.user – jasisz

ответ

31

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

От t он docs ...

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

Authorization: Token 9944b09199c62bcf9418ad846dd0e4bbdfc6ee4b 

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

+1

Если запрос перенаправляется, убедитесь, что токен отправляется как на начальном запросе, так и на последующем перенаправленном запрос. –

+0

«просто получите запрос request.user, чтобы вернуть аутентифицированного пользователя». docs сказал, что тот же «return Response (content)», но Im уже возвращает мой просмотр или что-то, что я хочу показать на странице api. как я могу вернуть оба? – Peter

+0

wow nevermind Я добавил «пользователь»: unicode (request.user) и «auth»: unicode (request.auth) с моим существующим возвратом и его работой сейчас. Но я должен был повторить мою просьбу (auth_token), потому что я использовал перенаправление между шаблонами. Спасибо всем :) – Peter

1

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

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

как я могу отправить маркер с запросом после моей апи

Вы можете использовать библиотеку Python requests.Для Джанго-отдых-рамочном TokenAuthentication, маркер должен быть передан в заголовке и префиксом строки 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)}) 
Смежные вопросы