使用 django-oauth-toolkit 在 Django rest 框架驱动的应用程序中进行客户端身份验证
Client Authentication in Django rest framework powered App using django-oauth-toolkit
我正在为我的移动应用程序在 django 中创建一个项目。 django 项目是移动应用程序的 API 后端。我已经使用 django rest 框架为用户模型创建了一个注册。注册 API 工作正常。现在,我只想让来自我的移动应用程序的请求得到满足。为此,我创建了一个 oauth 应用程序授权类型“client-credentials”
class UserSerializer(ModelSerializer):
email = serializers.EmailField(
required=True,
validators=[UniqueValidator(queryset=User.objects.all())]
)
username = serializers.CharField(
validators=[UniqueValidator(queryset=User.objects.all())]
)
password = serializers.CharField(min_length=8)
def create(self, validated_data):
user = User.objects.create_user(validated_data['username'], validated_data['email'],
validated_data['password'])
return user
class Meta:
model = User
fields = ('id', 'username', 'email', 'password')
read_only_fields = ('id',)
write_only_fields = ('password',)
这是用户序列化程序,视图是
class UserCreateAPIView(CreateAPIView):
queryset = User.objects.all()
serializer_class = UserSerializer
permission_classes = (IsAuthenticatedOrCreate, TokenHasScope)
但问题是我可以在不使用令牌的情况下直接调用注册 api。如何确保仅传递令牌时调用用户创建API或传递令牌时post请求有效。
您可以简单地创建一个授权类型为 Client Credentials 的应用程序,
并将您的权限 class 设置为:
permission_classes = [TokenHasReadWriteScope]
对于需要用户身份验证和授权的其他 API,您可以使用授权类型 Resource Owner Password Based 发布另一个客户端,
并将您的权限 class 设置为:
permission_classes = [TokenHasReadWriteScope, YourCustomPermission]
或者,如果您同时需要客户端凭据以及基于资源所有者的密码(例如,您的注册api 可能只需要客户端凭据,但编辑用户的个人信息可能需要资源所有者基于密码的授权)。为此,您可以创建自定义应用程序模型并允许客户端使用这两种模型。
http://django-oauth-toolkit.readthedocs.io/en/latest/advanced_topics.html?highlight=extending%20
我正在为我的移动应用程序在 django 中创建一个项目。 django 项目是移动应用程序的 API 后端。我已经使用 django rest 框架为用户模型创建了一个注册。注册 API 工作正常。现在,我只想让来自我的移动应用程序的请求得到满足。为此,我创建了一个 oauth 应用程序授权类型“client-credentials”
class UserSerializer(ModelSerializer):
email = serializers.EmailField(
required=True,
validators=[UniqueValidator(queryset=User.objects.all())]
)
username = serializers.CharField(
validators=[UniqueValidator(queryset=User.objects.all())]
)
password = serializers.CharField(min_length=8)
def create(self, validated_data):
user = User.objects.create_user(validated_data['username'], validated_data['email'],
validated_data['password'])
return user
class Meta:
model = User
fields = ('id', 'username', 'email', 'password')
read_only_fields = ('id',)
write_only_fields = ('password',)
这是用户序列化程序,视图是
class UserCreateAPIView(CreateAPIView):
queryset = User.objects.all()
serializer_class = UserSerializer
permission_classes = (IsAuthenticatedOrCreate, TokenHasScope)
但问题是我可以在不使用令牌的情况下直接调用注册 api。如何确保仅传递令牌时调用用户创建API或传递令牌时post请求有效。
您可以简单地创建一个授权类型为 Client Credentials 的应用程序, 并将您的权限 class 设置为:
permission_classes = [TokenHasReadWriteScope]
对于需要用户身份验证和授权的其他 API,您可以使用授权类型 Resource Owner Password Based 发布另一个客户端, 并将您的权限 class 设置为:
permission_classes = [TokenHasReadWriteScope, YourCustomPermission]
或者,如果您同时需要客户端凭据以及基于资源所有者的密码(例如,您的注册api 可能只需要客户端凭据,但编辑用户的个人信息可能需要资源所有者基于密码的授权)。为此,您可以创建自定义应用程序模型并允许客户端使用这两种模型。 http://django-oauth-toolkit.readthedocs.io/en/latest/advanced_topics.html?highlight=extending%20