我有一个问题。我必须为移动应用程序实现一些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)
这可能是个好主意? 你知道吗?
答案 0 :(得分:0)
您可以实施CheckMd5Header
custom permission class ,它会比较Md5_server
和Md5_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值匹配的请求才能访问。