Аутентификация по токену с помощью django rest framework - PullRequest
0 голосов
/ 05 декабря 2018

Это вывод Я пытаюсь извлечь данные из конечной точки API с помощью HTTPIE, следующая команда:

http http://127.0.0.1:8000/hello/ 'Authorization: Token c9a5b630b1887efdd3ca2db82aae9cec2c44257e'

Я сгенерировал токен и добавил его в конечную точку APIЯ также использовал curl для извлечения данных, но он показывает похожую ошибку.

Views.py

from django.shortcuts import render
from rest_framework.views import APIView
from rest_framework.response import Response
from rest_framework.permissions import IsAuthenticated


class HelloView(APIView):
   permission_classes = (IsAuthenticated,)

   def get(self,request):
     content = {'message': 'Hello'}
     return Response(content)

settings.py

INSTALLED_APPS = [
    'django.contrib.admin',
    'django.contrib.auth',
    'django.contrib.contenttypes',
    'django.contrib.sessions',
    'django.contrib.messages',
    'django.contrib.staticfiles',
    'core',
    'rest_framework',
    'rest_framework.authtoken',
]

REST_FRAMEWORK = {
   'DEFAULT_AUTHENTICATION_CLASSES': [
       'rest_framework.authentication.TokenAuthentication',
       'rest_framework.authentication.SessionAuthentication',
   ],
}

Выход

usage: http [--json] [--form] [--pretty {all,colors,format,none}]
            [--style STYLE] [--print WHAT] [--headers] [--body] [--verbose]
            [--all] [--history-print WHAT] [--stream] [--output FILE]
            [--download] [--continue]
            [--session SESSION_NAME_OR_PATH | --session-read-only SESSION_NAME_OR_PATH]
            [--auth USER[:PASS]] [--auth-type {basic,digest}]
            [--proxy PROTOCOL:PROXY_URL] [--follow]
            [--max-redirects MAX_REDIRECTS] [--timeout SECONDS]
            [--check-status] [--verify VERIFY]
            [--ssl {ssl2.3,ssl3,tls1,tls1.1,tls1.2}] [--cert CERT]
            [--cert-key CERT_KEY] [--ignore-stdin] [--help] [--version]
            [--traceback] [--default-scheme DEFAULT_SCHEME] [--debug]
            [METHOD] URL [REQUEST_ITEM [REQUEST_ITEM ...]]
http: error: argument REQUEST_ITEM: "Token" is not a valid value

Ответы [ 4 ]

0 голосов
/ 05 декабря 2018

Решение простое в следующем.Используйте двойные кавычки вместо одинарных кавычек, в отличие от того, что в DRF Documentation написано

. Для curl используйте команду ниже

curl -H "Authorization: Token c9a5b630b1887efdd3ca2db82aae9cec2c44257e" http://127.0.0.1:8000/hello/

Для HTTPie используйте

http GET http://127.0.0.1:8000/hello/ "Authorization: Token c9a5b630b1887efdd3ca2db82aae9cec2c44257e"

Обратите внимание, что двойные кавычки используются в документации вопреки одинарным кавычкам.

0 голосов
/ 05 декабря 2018

Вы можете попытаться использовать curl или даже почтальон, чтобы сделать запрос и посмотреть, работает ли он,

curl -X GET http://127.0.0.1:8000/hello/ -H "Authorization: Token Your generated token here"

Или, используя почтальон, передать свой токен в заголовок запроса следующим образом:

enter image description here

Не забудьте сгенерировать токен с помощью команды

python manage.py drf_create_token YOURUSER
0 голосов
/ 05 декабря 2018

Поскольку вы используете Windows, вы должны использовать двойные кавычки, чтобы содержать заголовок Authorization.Windows (в частности, cmd.exe) не распознает одинарные кавычки и обрабатывает каждую часть заголовка как отдельный аргумент.

Поэтому измените на:

http http://127.0.0.1:8000/hello/ "Authorization: Token c9a5b630b1887efdd3ca2db82aae9cec2c44257e"
0 голосов
/ 05 декабря 2018

Вы уверены, что установили заголовки для http-вызова?

--headers

Это пример из API doc:

curl -X GET http://127.0.0.1:8000/api/example/ -H 'Authorization: Token 9944b09199c62bcf9418ad846dd0e4bbdfc6ee4b'
...