【问题标题】:Django rest framework working with django oauth toolkitDjango 休息框架与 django oauth 工具包一起使用
【发布时间】:2017-08-02 21:31:32
【问题描述】:

我正在使用 Django rest 框架创建一个 API,并且我正在添加 oauth2 身份验证。 我能够正确设置它,并且可以获取令牌来访问我的 API 端点。到目前为止一切都很好。

我现在的问题是如何在受保护的内容和公开的内容方面更具选择性。在我的 API 中有一个端点子集,每个人都可以访问,因此他们是匿名用户,并且由于用户名和密码不存在,他们无法以相同的方式获取访问令牌。

这里是我的settings.py中的相关内容:

OAUTH2_PROVIDER = {
    # this is the list of available scopes
    'SCOPES': {
        'read': 'Read scope',
        'write': 'Write scope',
        'groups': 'Access to your groups'
    }
}

REST_FRAMEWORK = {
    'DEFAULT_AUTHENTICATION_CLASSES': (
        'oauth2_provider.ext.rest_framework.OAuth2Authentication',
    ),
    'DEFAULT_PERMISSION_CLASSES': (
        'rest_framework.permissions.IsAdminUser',
    ),
    'PAGE_SIZE': 10
}
INSTALLED_APPS = (
    ...
    'oauth2_provider',
    'rest_framework',
    ...
)

views.py:

# Everything fine for this end point
class PrivateViewSet(viewsets.ModelViewSet):
    serializer_class = custom_serializers.MySerializer
    http_method_names = ['get', 'post', 'head', 'options']
    permission_classes = (permissions.IsAuthenticated, custom_permissions.IsAdminOrOwner, TokenHasReadWriteScope)

# Getting the error
class PublicViewSet(viewsets.ModelViewSet):
    serializer_class = custom_serializers.MyPublicSerializer
    permission_classes = (permissions.AllowAny,)

所以当我尝试访问“PublicViewSet”端点时,我收到以下错误:

{"detail": "Authentication credentials were not provided."}

有没有办法决定应用 oauth2 授权并保持其他端点公开开放?

【问题讨论】:

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


    【解决方案1】:

    您无法访问PublicViewSet 端点,因为 它正在您提供的设置中寻找令牌 DEFAULT_AUTHENTICATION_CLASSES。它遵循类。 为了避免在视图中出现这种情况,您需要传递一个空的authentication_classes

    class PublicViewSet(viewsets.ModelViewSet):
        serializer_class = custom_serializers.MyPublicSerializer
        authentication_classes = ()
        permission_classes = (permissions.AllowAny,)
    

    【讨论】:

    • 非常感谢您的回复。我还找到了一种解决方法,默认情况下通过在 settings.py 'DEFAULT_AUTHENTICATION_CLASSES': ( 'rest_framework.authentication.BasicAuthentication', 'oauth2_provider.ext.rest_framework.OAuth2Authentication', ), 中添加这样的方式添加多个身份验证类,然后结合permission_classes 我可以让它工作。
    猜你喜欢
    • 2022-12-19
    • 2021-11-26
    • 1970-01-01
    • 2013-04-08
    • 2018-08-03
    • 2015-02-11
    • 2015-02-25
    相关资源
    最近更新 更多