Как получить и сохранить токен с помощью веб-сервиса Django - PullRequest
0 голосов
/ 07 июня 2018

Я не уверен, что я на правильном пути.Пожалуйста, дайте мне подсказку или направление.

Я настроил свой веб-сервис, используя Django, а также создал мобильное приложение с React Native, используя фреймворк Django REST.Django использует базовую аутентификацию сеанса, но Django REST API использует аутентификацию токена для обработки запроса от мобильного приложения.

Я хочу внедрить небольшое приложение ReactJS в мою существующую сеть Django.На данном этапе я думаю, что моему небольшому приложению реакции потребуется токен авторизации для связи с REST api для себя.

Итак, моя идея заключается в том, что когда пользователь входит на страницу веб-входа, необходимо получить токен API пользователя отAPI и сохраните их в cookie или localStorage, в то время как обычный процесс входа обрабатывается в веб-сервисе Django.Потому что я не хочу, чтобы пользователи снова входили в систему, чтобы запустить приложение реакции на моей веб-странице, чтобы получить токен авторизации.

Я в порядке?если так, как я могу заставить это работать?Пожалуйста, обратитесь к моему коду в Django login view.py. Нужен ли мне какой-то код, чтобы получить токен аутентификации API и сохранить его на стороне клиента?

def Login(request):
    if not request.user.is_authenticated:
        if request.method == "POST":
            email = request.POST['email']
            password = request.POST['password']
            user = authenticate(email = email, password = password)

            if user is not None:
                login(request, user)
                messages.add_message(request, messages.SUCCESS, request.user.nickname + ' Welcome!')
                return redirect('Search')
            else:
                messages.add_message(request, messages.WARNING, 'Please check Email / Password again')
                return redirect('login')
        else:
            form = LoginForm()
            return render(request, 'login.html', {'form': form })
    else:
        return redirect('main')

Ответы [ 3 ]

0 голосов
/ 07 июня 2018

Они оба выполняют похожие задачи с небольшими отличиями.

Token

Встроенная аутентификация токена DRF

  1. Один токен для всех сеансов
  2. Нетметка времени на токене

Аутентификация токена DRF JWT

  1. Один токен на сеанс
  2. Метка времени истечения на каждом токене

Доступ к базе данных

Встроенная аутентификация токена DRF

  1. Доступ к базе данных для выборки пользователя, связанного с токеном
  2. Проверка статуса пользователя
  3. Аутентификация пользователя

Аутентификация токена DRF JWT

  1. Токен декодирования (получитьполезная нагрузка)
  2. Проверка метки времени (истечение срока действия)
  3. Доступ к базе данных для выборки пользователя, связанного с идентификатором в полезной нагрузке
  4. Проверка статуса пользователя
  5. Аутентификация пользователя

Плюсы

Встроенная аутентификация токена DRF

  1. Позволяетrced-logout путем замены токена в базе данных (например, смена пароля)

Аутентификация токена DRF JWT

  1. токен со сроком действия
  2. Нет попадания в базу данных, если токен не действителен

Минусы

Встроенная аутентификация токена DRF

  1. Попадание в базу данных по всем запросам
  2. Один токен для всех сеансов

Аутентификация токена DRF JWT

  1. Невозможно выполнитьвызвать токен, не отслеживая его в базе данных
  2. После того, как токен выпущен, любой, у кого есть токен, может отправлять запросы
  3. Спецификации открыты для интерпретаций, нет единого мнения о том, как выполнить обновление

Ссылка: Django: аутентификация на основе токена DRF VS JSON Web Token

0 голосов
/ 10 июня 2018

Я бы хотел оставить свой ответ после того, как решил свои долгие исследования и учебу.Мое решение довольно простое.включить аутентификацию сеанса DRF.Добавление некоторого кода в setting.py

REST_FRAMEWORK = {
    # ...
    'DEFAULT_AUTHENTICATION_CLASSES': (
        'rest_framework.authentication.TokenAuthentication',
        'rest_framework.authentication.SessionAuthentication',
    ),
}

2.добавьте 'credentials: "include"' в код извлечения, чтобы использовать уже авторизованный cookie-файл сеанса для аутентификации.

await fetch(API_URL, {
    credentials: "include"
})

это решение решило мою проблему.

0 голосов
/ 07 июня 2018

Вы сделали некоторые бесполезные в вашей функции входа в систему.Вы можете использовать JWT.у него есть хорошая функция для поддержки входа в систему.В функции входа в систему, когда отправляет имя пользователя и пароль вместе с сообщением, он возвращает токен клиенту.http://getblimp.github.io/django-rest-framework-jwt/

Вам просто нужно установить urlpattern

from rest_framework_jwt.views import obtain_jwt_token
#...

urlpatterns = [
    '',
    # ...

    url(r'^api-token-auth/', obtain_jwt_token),
]

Он возвращает токен

$ curl -X POST -d  "username=admin&password=password123" http://localhost:8000/api-token-auth/

В другом запросе, если вам нужна аутентификация, используйте следующий запрос

$ curl -H "Authorization: JWT <your_token>" http://localhost:8000/protected-url/
...