Django OAuth Toolkit - Зарегистрировать пользователя

Я просмотрел документы поставщика и ресурса Django OAuth Toolkit, но все, что я смог найти, это how to 'authenticate' a userне как register Пользователь.

Я могу настроить все на своем компьютере, но не знаю, как зарегистрировать пользователя, используя имя пользователя и пароль. Я знаю, что мне не хватает чего-то очень тонкого. Как мне точно зарегистрировать пользователя и получить токен доступа для общения с моими ресурсами?

ИЛИ ЖЕ

Это как если бы я сначала зарегистрировал пользователя с помощью обычного механизма Django, а затем получил его же?

3 ответа

Решение

Вы можете делать то, что вы просите, и это ваш счастливый день. Я столкнулся с этой проблемой, когда впервые начал работать с django а также oauth-toolkit,

Ниже моя реализация с использованием django-rest-framework, Он зарегистрирует пользователя, подтвердит подлинность и возвратит ответ oauth.

Мысль такова: используя модели django, мы сохраняем нового пользователя, используя соответствующие сериализаторы и модели. В том же ответе мы создаем новый токен oauth и возвращаем его пользователю.

serializers.py

from rest_framework import serializers
import models
from django.utils.translation import gettext_lazy as _


class RegisterSerializer(serializers.ModelSerializer):
    confirm_password = serializers.CharField()

    def validate(self, data):
        try:
            user = models.User.objects.filter(username=data.get('username'))
            if len(user) > 0:
                raise serializers.ValidationError(_("Username already exists"))
        except models.User.DoesNotExist:
            pass

        if not data.get('password') or not data.get('confirm_password'):
            raise serializers.ValidationError(_("Empty Password"))

        if data.get('password') != data.get('confirm_password'):
            raise serializers.ValidationError(_("Mismatch"))

        return data

    class Meta:
        model = models.User
        fields = ('username', 'first_name', 'last_name', 'password', 'confirm_password', 'is_active')
        extra_kwargs = {'confirm_password': {'read_only': True}}

view.py

from rest_framework.views import APIView
from rest_framework.response import Response
from rest_framework import status, permissions
from oauth2_provider.settings import oauth2_settings
from braces.views import CsrfExemptMixin
from oauth2_provider.views.mixins import OAuthLibMixin

import json
import models
import serializers

from django.utils.decorators import method_decorator
from django.http import HttpResponse
from django.views.generic import View
from django.views.decorators.debug import sensitive_post_parameters
from django.utils.translation import gettext_lazy as _
from django.db import transaction


class UserRegister(CsrfExemptMixin, OAuthLibMixin, APIView):
    permission_classes = (permissions.AllowAny,)

    server_class = oauth2_settings.OAUTH2_SERVER_CLASS
    validator_class = oauth2_settings.OAUTH2_VALIDATOR_CLASS
    oauthlib_backend_class = oauth2_settings.OAUTH2_BACKEND_CLASS

    def post(self, request):
        if request.auth is None:
            data = request.data
            data = data.dict()
            serializer = serializers.RegisterSerializer(data=data)
            if serializer.is_valid():
                try:
                    with transaction.atomic():
                        user = serializer.save()

                        url, headers, body, token_status = self.create_token_response(request)
                        if token_status != 200:
                            raise Exception(json.loads(body).get("error_description", ""))

                        return Response(json.loads(body), status=token_status)
                except Exception as e:
                    return Response(data={"error": e.message}, status=status.HTTP_400_BAD_REQUEST)
            return Response(data=serializer.errors, status=status.HTTP_400_BAD_REQUEST)
        return Response(status=status.HTTP_403_FORBIDDEN) 

urls.py

rom django.conf.urls import url
from oauth2_provider import views as oauth2_views

import views

urlpatterns = [
    url(r'^user/register/$', views.UserRegister.as_view()),
]

Вы должны создать пользователя, используя обычный механизм Django (например, вы можете добавлять новых пользователей из админки или из оболочки django). Однако, чтобы получить токен доступа, потребитель OAuth должен отправить запрос на сервер OAuth, где пользователь авторизует его, после того как сервер подтвердит авторизацию, он вернет токен доступа.

Вы должны зарегистрировать пользователей отдельно.

django-oauth-toolkit необходим, если вы собираетесь, например, поддерживать Alexa Skill, который требует "связывания" аккаунтов. Amazon нужен токен, представляющий существующего пользователя в вашей системе.

django-allauth позволяет легко зарегистрироваться через третьих лиц, например, Amazon, Google или Slack. Вы можете использовать его для упрощения регистрации пользователей, например, во время "привязки" аккаунта Alexa.

Для интеграции игрушечной команды Slack, которую я написал, я добавил пользовательский код для создания новых пользователей django на основе их уникального идентификатора пользователя Slack, полностью пропуская рабочий процесс OAuth "войти в Slack". Только когда эти пользователи django существуют, django-oauth-toolkit может выдавать им токены.

Я регистрирую пользователя с помощью обычного механизма django в сочетании с данными клиента приложения django-oauth-toolkit (идентификатор клиента и секретный ключ клиента).

У меня есть отдельный UserRegisterApiViewкоторый не ограничивается аутентификацией токена, но проверяет идентификатор клиента и секретный ключ клиента при отправке почтового запроса на регистрацию нового пользователя. Таким образом, мы ограничиваем доступ к зарегистрированному URL только для зарегистрированных клиентов OAuth.

Вот рабочий процесс регистрации:

  1. Запрос на регистрацию пользователя из приложения React/Angular/View с client_id а также client_secret.
  2. Django проверит действительность client_id и client_secret, если не отвечает 401 unauthorized.
  3. Если действительные и зарегистрированные данные пользователя действительны, зарегистрируйте пользователя.
  4. При успешном ответе перенаправьте пользователя на страницу входа.
Другие вопросы по тегам