【问题标题】:Django provide API for 3rd Party UsageDjango 为第 3 方使用提供 API
【发布时间】:2017-08-07 17:50:41
【问题描述】:

我们在 Django 中有自己的解决方案,我们正在使用 DRF 和 JWT 为我们的 Android 应用程序生成 API(这样创建的 API 将访问我们的服务器,django 代码将在其上运行,然后执行必要的 CRUD 操作) .

现在,我们计划让我们的 API 可供第三方用户使用,以便他们的解决方案可以直接访问我们的 API。

我们需要知道 API 是被我们自己的 Android 应用程序或 javascript 代码访问还是被第三方代码访问(我们需要计算第三方访问我们 API 的次数) . 无论如何我们可以解决这个问题吗?

如果我们要为第 3 方提供单独的 API,并为我们自己的使用提供单独的 API,那么使用 javascript,人们可以轻松读取我们的内部 API 并滥用它们(即,使用来自第 3 方的内部 api 访问我们的服务器代码)。

任何让我们朝着正确方向开始的通用帮助,以便我们可以阅读和学习都会有所帮助。

【问题讨论】:

    标签: android django rest api django-rest-framework


    【解决方案1】:

    您应该查看权限 (http://www.django-rest-framework.org/api-guide/permissions/) 和限制 (http://www.django-rest-framework.org/api-guide/throttling/)。您可能想要阻止/限制某些用户代理,例如 curl、android 等。

    from rest_framework import permissions
    
    class UserAgentBlacklist(permissions.BasePermission):
        message = 'Please set a custom user agent when using scripts with our API.'
    
        def has_permission(self, request, view):
            user_agent = request.META['HTTP_USER_AGENT']
            for agent in ['libcurl', 'Python-urllib', 'python-requests']:
                if user_agent.startswith(agent):
                    return False
            return True
    

    【讨论】:

    • 我已经在使用 JWT 权限系统了。但我想知道是否有任何方法(必须有)将 API 调用与我们的 android 应用程序或我们的 JS 代码与 3rd 方代码的调用分开?关于限制,我没有考虑用户使用 API 访问我们的解决方案的次数。我只需要实际计数。
    • 使用示例代码更新了评论,以解释如何使用权限来阻止某些客户端。
    • 现在,假设我们有一个使用 android 的 3rd 方应用程序和我们自己的使用 android 的应用程序......这两者如何区分?这会有所帮助。
    • 例如,我的意思是 http_user_agent 对于 2 个不同的 Android 应用程序可能是相同的,对吧? (一个是我们的应用程序,另一个是不同的第三方应用程序,它只是调用我们的 API)。 2 个 chrome 调用相同(一个可以来自我们的网站,另一个可以来自第 3 方网站)。我想要一种机制来区分这两者。
    • 在这种情况下,可以在客户端进行区分(虽然不理想,因为它可以伪造)。例如,如果您使用 reactjs,您将传递一个特定的 prop 来指示您自己的应用程序,然后将逻辑留在服务器上。
    猜你喜欢
    • 2013-08-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-01-26
    • 2012-01-03
    • 2021-04-19
    • 1970-01-01
    相关资源
    最近更新 更多