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 中,是不是可以同时使用 oauth 和 session 身份验证?
django-rest-framework 和 swagger api 文档