Public REST api: 添加保护级别

Public REST api: add protection level

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

为此 API 不需要某些身份验证系统:所有 API 都是 public,应用程序可以调用此 API。

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

我想在服务器和移动应用程序上实现一个将日期 + 其他信息作为参数(例如)的功能。

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

当客户端调用我的 API 之一时,它会将此字符串放入 http 请求 header。 服务器将检查此字符串 运行 相同的功能并检查结果。

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

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

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

您可以实现一个CheckMd5Headercustom permission class,它将比较Md5_serverMd5_mobile的值并允许访问仅当 2 个值相同时。

要实现自定义权限,您必须覆盖 BasePermission class 并实现 .has_permission() 方法。如果请求应该被授予访问权限,则此方法应该 return 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 设置中添加此权限 class。

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

这告诉 DRF 对发生的任何请求使用此权限 class。只有 headers 中的 md5 值与服务器的 md5 值匹配的请求才被允许访问。