【问题标题】:how can I securely perform Rest requests without authentication?如何在没有身份验证的情况下安全地执行 Rest 请求?
【发布时间】:2017-06-17 20:41:28
【问题描述】:

这更像是一个流程逻辑问题,而不是一个特定的语言框架问题。

我正在开发一个移动应用程序,并希望用户无需登录即可使用它(即尝试并为登录的用户提供加分),但我不希望其他人从假设 Postman 或应用程序以外的任何其他平台没有某种密钥,那么这里的方法是什么?

我正在考虑使用一些秘密用户名:访客密码或某种令牌进行基本身份验证,但由于我对此完全陌生,我不确定这是否是正确的方法,我已经阅读了身份验证和权限 Django Rest Framework 教程,但还没有找到解决方案

【问题讨论】:

    标签: django rest authentication


    【解决方案1】:

    我自己正在学习 Django,并且已经了解了该主题中更高级的主题。您可以做的是在您的 permissions.py 文件中为此创建一个函数。像这样:

    from rest_framework import permissions
    
    class specialMobileUserPermissions(permissions.BasePermission):
        def has_object_permission(self, request, view, obj):
            if request.method in request.SAFE_METHODS:
                return True
    
            if request.user.id == whatever your mobile users id is:
                return false
    
            return obj.id == request.user.id # if the user is a subscribed user and they are logged in return true
    
            return false # because we need a way out if none of the above works
    

    因此,在处理权限类时,permissions.SAFE_PERMISSIONS 是非破坏性权限的列表。因此,第一个 if 语句询问您是 GET、HEAD 还是其他非数据更改方法。如果是,则返回 true。

    第二个 if 语句检查发出请求的用户的用户 ID。如果该用户 id 等于您为移动跟踪用户设置的用户 id,它将返回 false,拒绝使用此类的任何权限。

    在您的视图中,您需要添加如下所示的 permissions_classes 变量

    from . import permissions # your permissions.py file
    
    class FooViewSet(viewsets.ViewSet):
        permission_classes = (permissions.specialMobileUserPermissions,)
    

    除非您需要额外的功能,否则这应该是您需要的一切,一直到导入。我希望我有所帮助。

    【讨论】:

    • 谢谢 Joshua,所以据我所知,我必须创建一种移动 ID,只允许未登录的用户使用 SAFE_METHODS,但如果我希望他们能够发表一些帖子怎么办,我必须提供一种秘密加密的移动 ID 以确保其安全,或者根本不建议这样做?
    • id 是用户数据库的主键,因此您需要设置您的移动试用用户并获取其主键(即该用户的 id)并将第二个 if 语句更改为如果 obj.id == id:
    猜你喜欢
    • 2020-09-26
    • 2021-04-08
    • 1970-01-01
    • 2021-07-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-11-30
    • 2023-03-21
    相关资源
    最近更新 更多