Python Django OAuth Toolkit-注册用户

Python Django OAuth Toolkit-注册用户,python,django,django-rest-framework,django-registration,django-oauth,Python,Django,Django Rest Framework,Django Registration,Django Oauth,我已经浏览了Django OAuth Toolkit的提供者和资源文档,但我能找到的只是如何“验证”用户,而不是如何注册用户 我可以在我的机器上设置所有内容,但不知道如何使用用户名和密码注册用户。我知道我错过了一些非常微妙的东西。我如何准确地注册一个用户并获得一个访问令牌,作为与我的资源服务器对话的回报 或 是否我必须首先使用普通Django机制注册用户,然后获得相同的令牌?您必须使用普通Django机制创建用户(例如,您可以从admin或Django shell添加新用户)。然而,为了获得访问

我已经浏览了Django OAuth Toolkit的提供者和资源文档,但我能找到的只是
如何“验证”用户
,而不是
如何注册用户

我可以在我的机器上设置所有内容,但不知道如何使用用户名和密码注册用户。我知道我错过了一些非常微妙的东西。我如何准确地注册一个用户并获得一个访问令牌,作为与我的资源服务器对话的回报


是否我必须首先使用普通Django机制注册用户,然后获得相同的令牌?

您必须使用普通Django机制创建用户(例如,您可以从admin或Django shell添加新用户)。然而,为了获得访问令牌,OAuth使用者应该向OAuth服务器发送一个请求,用户将在该服务器上对其进行授权,一旦服务器验证授权,它将返回访问令牌。

您必须单独注册用户

django oauth工具包是必要的,例如,如果您要支持需要“链接”帐户的Alexa技能。Amazon需要一个表示系统上现有用户的令牌

使通过第三方(如亚马逊、谷歌或Slack)提供注册变得容易。您可以考虑使用它来简化用户注册,例如在Alexa帐户“链接”期间。


对于我编写的toy Slack命令集成,我添加了自定义代码,以根据django用户的唯一Slack用户id创建新的django用户,完全跳过OAuth“使用Slack登录”工作流。只有当这些django用户存在时,django oauth toolkit才能为他们发行代币。

你可以做你想做的事,这是你的幸运日。当我第一次开始使用
django
oauth工具包时,我就遇到了这个问题

下面是我使用
django rest框架
的实现。它将注册用户、验证并返回oauth响应

思想是这样的: 使用django模型,我们使用适当的序列化程序和模型保存新用户。 在相同的响应中,我们创建一个新的oauth令牌并将其返回给用户

序列化程序.py view.py url.py
我正在使用常规的django机制和django oauth工具包的应用程序客户机详细信息(客户机id和客户机密钥)注册用户

我有单独的
UserRegisterApiView
,它不受令牌身份验证的限制,但在发出post请求注册新用户时,它会检查客户端id和客户端密钥。通过这种方式,我们将注册url访问限制为仅注册的OAuth客户端

以下是注册工作流:

  • 来自React/Angular/View应用程序的用户注册请求,具有
    客户端id
    客户端机密
  • Django将检查客户端id和客户端机密是否有效(如果未响应)
  • 如果有效且注册用户数据有效,请注册用户
  • 成功响应时,将用户重定向到登录页面

  • 那么,如果使用单独的AuthServer和ResourceServer,用户是在哪里创建的呢?仅在AuthServer上或在两者上?应仅在auth server上创建用户。根据访问要求,您应该实现ACL.Awesome,+1作为答案。您实现了吗?我收到
    {'error':'invalid_grant','error_description':'invalid credentials gived.}
    错误我正在为
    创建应用程序创建API端点
    ?有人已经这样做了吗?你应该把它当作另一个问题来问。
    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}}
    
    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) 
    
    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()),
    ]