公共REST API:添加保护级别

时间:2015-09-18 18:32:04

标签: django api rest http-headers django-rest-framework

我有一个问题。我必须为移动应用程序实现一些REST API。 我使用DJANGO Rest Framework。

对于此API,不需要某些身份验证系统:所有API都是公开的,应用可以调用此API。

我会添加最低级别的保护。 我的目标是不允许任何客户端调用这些API。

我想在服务器和移动应用上实现一个功能,例如日期+其他信息。

es: build_toke(date, secret_number) -> Md5 string

当客户端调用我的一个API时,它会将此字符串放在http请求标头中。 服务器将检查此字符串是否运行相同的函数并检查结果。

Md5_server = build_toke(date, secret_number) 
Md5_mobile = header_http.get_code()

if Md5_server == Md5_mobile -> OK
else return 401 (not authorized)

这可能是个好主意? 你知道吗?

1 个答案:

答案 0 :(得分:0)

您可以实施CheckMd5Header custom permission class ,它会比较Md5_serverMd5_mobile的值,并且仅在2个值时才允许访问是一样的。

要实现自定义权限,您必须覆盖BasePermission类并实施.has_permission()方法。如果请求被授予访问权限,则此方法应返回True,否则返回False

class CheckMd5Header(permissions.BasePermission):
    """
    Permission class to check if the Md5 string in the 
    request header is same as of the Md5 server string
    """

    def has_permission(self, request, view):
        md5_mobile = request.META.get('Md5_mobile') # get the value of md5 mobile header
        md5_server = build_toke(date, secret_number) # generate md5 server string
        return md5_server == md5_mobile # return True or False

然后,您需要在DRF设置中添加此权限类。

REST_FRAMEWORK = {
    'DEFAULT_PERMISSION_CLASSES': (
        ...
        'my_app.permissions.CheckMd5Header', # specify custom permission class
    )
}

这告诉DRF对发生的任何请求使用此权限类。只允许那些标头中的md5值与服务器的md5值匹配的请求才能访问。