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

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

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

OR

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


person PythonEnthusiast    schedule 28.02.2018    source источник


Ответы (4)


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

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

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

сериализаторы.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()),
]
person Gal Silberman    schedule 07.03.2018
comment
Отлично, +1 за ответ. - person Anup Yadav; 08.03.2018
comment
Вы заставили это работать? Я получаю {'error': 'invalid_grant', 'error_description': 'Invalid credentials given.'} ошибку - person animesh manglik; 28.06.2018
comment
Я хочу создать конечную точку API для create application? кто-нибудь уже сделал это? - person SACHIN CHAVAN; 06.08.2019
comment
Вы должны задать его как другой вопрос. - person Gal Silberman; 06.08.2019

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

person ChillarAnand    schedule 06.03.2018
comment
Итак, где создаются пользователи в случае отдельных AuthServer и ResourceServer? Только на AuthServer или на обоих? - person PythonEnthusiast; 07.03.2018
comment
Пользователи должны создаваться только на сервере авторизации. В зависимости от требований к доступу вы должны реализовать ACL. - person ChillarAnand; 08.03.2018

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

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

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

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

person David Chandler    schedule 06.03.2018

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

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

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

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