Django OAuth Toolkit - 注册用户

11
我已经仔细阅读了Django OAuth Toolkit的Provider和Resource文档,但是我只能找到如何“验证”用户而不是如何通过用户名和密码“注册”用户的相关内容。虽然已经在我的设备上设置好了所有东西,但我并不确定该如何完成用户的注册。我明白我可能遗漏了一些微妙的部分。请问我应该如何正确地注册一个用户并获得一个访问令牌来与我的资源服务器进行通信呢?或者说,我是否需要首先使用Django的正常机制注册用户,然后才能获取相应的令牌?
4个回答

30

你想要的事情是可以做到的,而且今天是你的幸运日。当我开始使用 djangooauth-toolkit 时,我也遇到了这个问题。

下面是我的实现,使用了 django-rest-framework。它会注册用户,进行身份验证并返回一个oauth响应。

思路如下: 使用django模型,我们使用正确的序列化器和模型保存新用户。 在同一响应中,我们创建一个新的oauth token并将其返回给用户。

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()),
]

6

您需要使用正常的Django机制创建用户(例如,您可以从管理员或django shell添加新用户)。但是,为了获得访问令牌,OAuth消费者应向OAuth服务器发送请求,在那里用户将授权它。一旦服务器验证了授权,它将返回访问令牌。


那么,在分离的AuthServer和ResourceServer的情况下,用户是在哪里创建的?只在AuthServer上还是两者都有? - Praful Bagai
用户应该只在认证服务器上创建。根据访问要求,您应该实现ACL。 - Chillar Anand

2

您必须单独注册用户。

如果您要支持需要“链接”帐户的Alexa技能,那么django-oauth-toolkit是必需的。亚马逊需要一个代表您系统上现有用户的令牌。

django-allauth可轻松提供通过第三方(例如Amazon、Google或Slack)进行注册。您可以考虑使用它来简化用户注册,例如在Alexa帐户“链接”期间。

对于我编写的玩具Slack命令集成,我添加了自定义代码,根据其唯一的Slack用户ID创建新的django用户,完全跳过OAuth“使用Slack登录”的工作流程。只有这些django用户存在,django-oauth-toolkit才能为它们发出令牌。


1

我正在使用常规的Django机制与django-oauth-toolkit的应用程序客户端详细信息(客户端ID和客户端密钥)注册用户。

我有一个单独的UserRegisterApiView,它没有受到令牌身份验证的限制,但在向服务器发送注册新用户的POST请求时会检查客户端ID和客户端密钥。通过这种方式,我们将注册URL访问限制为仅限已注册的OAuth客户端。

以下是注册工作流程:

  1. React / Angular / View应用程序发送带有client_idclient_secret的用户注册请求。
  2. Django将检查客户端ID和客户端密钥是否有效,如果无效,则响应401未经授权。
  3. 如果有效并且注册用户数据有效,则注册用户。
  4. 成功响应后将用户重定向到登录页面。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接