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.
Вот рабочий процесс регистрации:
- Запрос на регистрацию пользователя из приложения React/Angular/View с
client_id
а такжеclient_secret
. - Django проверит действительность client_id и client_secret, если не отвечает 401 unauthorized.
- Если действительные и зарегистрированные данные пользователя действительны, зарегистрируйте пользователя.
- При успешном ответе перенаправьте пользователя на страницу входа.