【问题标题】:Client Authentication in Django rest framework powered App using django-oauth-toolkit使用 django-oauth-toolkit 在 Django rest 框架驱动的应用程序中进行客户端身份验证
【发布时间】:2018-05-19 20:59:08
【问题描述】:

我正在 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。如何确保仅传递token时调用User Create API或传递token时post请求有效。

【问题讨论】:

  • 您能否将 REST_FRAMEWORK 默认身份验证类和权限类 (settings.py) 放在问题中.. 问题在于您提供的身份验证/权限。
  • 什么是“IsAuthenticatedOrCreate”权限?它允许用户请求创建而无需身份验证。
  • @SajiXavier IsAuthenticatedOrCreate 是我创建的一个权限类,它允许经过身份验证的用户登录和未经身份验证的用户注册 class IsAuthenticatedOrCreate(permissions.IsAuthenticated): def has_permission(self, request, view): if request .method == 'POST': return True return super(IsAuthenticatedOrCreate, self).has_permission(request, view)
  • oauth 仅用于身份验证,您需要根据身份验证状态定义适当的权限。因此,如果您允许用户在没有身份验证的情况下进行注册,那么 Signup API 将在没有令牌的情况下可用。请尝试使用“IsAuthenticated”

标签: django oauth oauth-2.0 django-rest-framework django-oauth


【解决方案1】:

您可以简单地创建一个授权类型为 Client Credentials 的应用程序, 并将您的权限类设置为:

permission_classes = [TokenHasReadWriteScope]

对于需要用户身份验证和授权的其他 API,您可以发出另一个授予类型 Resource Owner Password Based 的客户端, 并将您的权限类设置为:

permission_classes = [TokenHasReadWriteScope, YourCustomPermission]

或者,如果您同时需要 客户端凭据 以及 基于资源所有者密码(例如,您的注册 api 可能只需要客户端凭据但编辑用户的个人信息可能需要基于资源所有者密码的授权)。为此,您可以创建自定义应用程序模型并允许客户端使用两者。 http://django-oauth-toolkit.readthedocs.io/en/latest/advanced_topics.html?highlight=extending%20

【讨论】:

猜你喜欢
  • 2015-08-30
  • 2021-06-05
  • 2015-02-22
  • 2019-05-02
  • 2017-12-05
  • 2018-02-12
  • 1970-01-01
  • 2015-07-24
  • 2021-11-28
相关资源
最近更新 更多