Django OAuth Toolkit - 注册一个用户



我已经浏览了Django OAuth工具包的提供者和资源的文档,但我所能找到的只是how to 'authenticate' a user,而不是如何register用户。

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

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

你可以做你要求的事情,这是你的幸运日。当我第一次开始使用djangooauth-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 机制创建用户(例如,你可以从 admin 或 django shell 添加新用户(。但是,要获取访问令牌,OAuth 使用者应向用户将授权的 OAuth 服务器发送请求,一旦服务器验证授权,它将返回访问令牌。

您必须单独注册用户。

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

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

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

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

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

以下是注册工作流:

  1. 来自React/Angular/View应用程序的用户注册请求,具有client_idclient_secret
  2. Django 将检查 client_id 和 client_secret 是否有效,如果没有响应 401 未经授权。
  3. 如果有效且注册用户数据有效,请注册用户。
  4. 成功响应时,将用户重定向到登录页面。

相关内容

  • 没有找到相关文章

最新更新