Django OAuth 工具包 - 注册用户
Django OAuth Toolkit - Register a user
我已经浏览了 Django OAuth 工具包的提供者和资源的文档,但我能找到的只是 how to 'authenticate' a user
,而不是如何 register
用户。
我可以在我的机器上设置所有内容,但不确定如何使用用户名和密码注册用户。我知道我错过了一些非常微妙的东西。我如何准确地注册用户并在 return 中获取访问令牌以与我的资源服务器通信。
或
我是否必须先使用普通的 Django 机制注册用户,然后获取相同的令牌?
您必须使用正常的 Django 机制创建用户(例如,您可以从管理员或 Django shell 添加新用户)。但是,要获得访问令牌,OAuth 消费者应向 OAuth 服务器发送请求,用户将在服务器上对其进行授权,一旦服务器验证授权,它将 return 访问令牌。
您必须单独注册用户。
如果您要支持需要 "linking" 帐户的 Alexa 技能,django-oauth-toolkit 是必需的。亚马逊需要一个代表您系统上现有用户的令牌。
django-allauth 使通过第三方提供注册变得容易,例如亚马逊、Google 或 Slack。您可能会考虑使用它来简化用户注册,例如在 Alexa 帐户期间 "linking".
对于我编写的玩具 Slack 命令集成,我添加了自定义代码以根据其唯一的 Slack 用户 ID 创建新的 Django 用户,完全跳过了 OAuth "sign in with Slack" 工作流程。只有存在这些 django 用户后,django-oauth-toolkit 才能为他们发行令牌。
你能做到你所要求的,这是你的幸运日。当我第一次开始使用 django
和 oauth-toolkit
.
时,我遇到了这个问题
以下是我使用django-rest-framework
实现的。它将注册用户、进行身份验证和 return oauth 响应。
思路是这样的:
使用 django 模型,我们使用适当的序列化器和模型保存新用户。
在同一个响应中,我们创建一个新的 oauth 令牌并将其 return 提供给用户。
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-toolkit 的应用程序客户端详细信息(客户端 ID 和客户端密钥)注册用户。
我有单独的 UserRegisterApiView
,它不受令牌身份验证的限制,但它会在发出 post 请求以注册新用户时检查客户端 ID 和客户端密钥。通过这种方式,我们将注册 url 访问权限限制为仅注册的 OAuth 客户端。
注册流程如下:
- 来自 React/Angular/View 应用的用户注册请求
client_id
和 client_secret
。
- Django 将检查 client_id 和 client_secret 是否有效,如果未响应 401 未经授权。
- 如果有效且注册用户数据有效,则注册用户。
- 成功响应后将用户重定向到登录页面。
我已经浏览了 Django OAuth 工具包的提供者和资源的文档,但我能找到的只是 how to 'authenticate' a user
,而不是如何 register
用户。
我可以在我的机器上设置所有内容,但不确定如何使用用户名和密码注册用户。我知道我错过了一些非常微妙的东西。我如何准确地注册用户并在 return 中获取访问令牌以与我的资源服务器通信。
或
我是否必须先使用普通的 Django 机制注册用户,然后获取相同的令牌?
您必须使用正常的 Django 机制创建用户(例如,您可以从管理员或 Django shell 添加新用户)。但是,要获得访问令牌,OAuth 消费者应向 OAuth 服务器发送请求,用户将在服务器上对其进行授权,一旦服务器验证授权,它将 return 访问令牌。
您必须单独注册用户。
如果您要支持需要 "linking" 帐户的 Alexa 技能,django-oauth-toolkit 是必需的。亚马逊需要一个代表您系统上现有用户的令牌。
django-allauth 使通过第三方提供注册变得容易,例如亚马逊、Google 或 Slack。您可能会考虑使用它来简化用户注册,例如在 Alexa 帐户期间 "linking".
对于我编写的玩具 Slack 命令集成,我添加了自定义代码以根据其唯一的 Slack 用户 ID 创建新的 Django 用户,完全跳过了 OAuth "sign in with Slack" 工作流程。只有存在这些 django 用户后,django-oauth-toolkit 才能为他们发行令牌。
你能做到你所要求的,这是你的幸运日。当我第一次开始使用 django
和 oauth-toolkit
.
以下是我使用django-rest-framework
实现的。它将注册用户、进行身份验证和 return oauth 响应。
思路是这样的: 使用 django 模型,我们使用适当的序列化器和模型保存新用户。 在同一个响应中,我们创建一个新的 oauth 令牌并将其 return 提供给用户。
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-toolkit 的应用程序客户端详细信息(客户端 ID 和客户端密钥)注册用户。
我有单独的 UserRegisterApiView
,它不受令牌身份验证的限制,但它会在发出 post 请求以注册新用户时检查客户端 ID 和客户端密钥。通过这种方式,我们将注册 url 访问权限限制为仅注册的 OAuth 客户端。
注册流程如下:
- 来自 React/Angular/View 应用的用户注册请求
client_id
和client_secret
。 - Django 将检查 client_id 和 client_secret 是否有效,如果未响应 401 未经授权。
- 如果有效且注册用户数据有效,则注册用户。
- 成功响应后将用户重定向到登录页面。