Django-rest-framework 和 django-rest-framework-jwt APIViews and validation Authorization headers

Posted

技术标签:

【中文标题】Django-rest-framework 和 django-rest-framework-jwt APIViews and validation Authorization headers【英文标题】:Django-rest-framework and django-rest-framework-jwt APIViews and validation Authorization headers 【发布时间】:2019-05-12 20:56:08 【问题描述】:

我正在使用 DRF 和 DRF-jwt 来保护我的 API。目前我有一些这样写的CBV

class Organization(APIView):
    permission_classes = (IsAuthenticated,)
    @method_decorator(csrf_exempt, name='dispatch')
    class OfficeVisitsOverview(APIView):
        def post(self, request, *args, **kwargs):
            cursor = connection.cursor()
            (before, today) = getDateRange()
            cursor.execute("SELECT format(COUNT(*), 'N0') \
                            FROM Medi_OfficeVisit \
                            WHERE ( cast(VisitDate as date) BETWEEN '0' AND '1' ) \
                    ".format(before, today))
            data = dictfetchall(cursor)
            connection.close()
            return JsonResponse("numberOfOVs": data[0][""])

根据我的理解,APIView 和权限类 IsAuthenticated 确保存在与请求标头一起发送的授权令牌。你怎么能确定没有人修改过 JWT?我怎么知道我的 Django 应用程序中的 Secret_Token 每次都被用来解码/编码/验证/验证每个请求接收/发送的 JWT?这对我的 API 向公众开放是否足够安全?

【问题讨论】:

【参考方案1】:

经过身份验证只需确保当前 request.user.is_authenticated 为 True。检查标头、验证令牌等并设置 User.is_authenticated 是身份验证后端的责任。这是您在设置 rest-framework-jwt 时添加到设置文件中的一个。这是一个专为安全身份验证而创建的应用程序,所以是的,这就足够了。但是你还是要照顾其他方面的,比如 SSL、sql 注入等等(搜索 Django 安全性)。 警告!不要使用 .format 创建 SQL 查询,因为这是 SQL 注入的直接方式。如果您稍后使用一些用户提供的参数进行查询,您将处于危险之中。将参数作为第二个参数传递给 cursor.execute 或使用 ORM 来避免这种情况。

【讨论】:

以上是关于Django-rest-framework 和 django-rest-framework-jwt APIViews and validation Authorization headers的主要内容,如果未能解决你的问题,请参考以下文章

django-rest-framework 按日期过滤=无

django-rest-framework 令牌认证和注销

在 django-rest-framework 中,是不是可以同时使用 oauth 和 session 身份验证?

django-rest-framework 和 swagger api 文档

django-rest-framework:每个 ViewSet 可以有多个模板吗?

如何为 django-rest-framework api 编写单元测试?