编写自定义身份验证
来自 django.contrib.auth.models 从 rest_framework 导入用户从 rest_framework 导入例外导入例外
此示例身份验证直接来自此处的官方文档。
class ExampleAuthentication(BaseAuthentication):
def authenticate(self, request):
username = request.META.get('X_USERNAME')
if not username:
return None
try:
user = User.objects.get(username=username)
except User.DoesNotExist:
raise AuthenticationFailed('No such user')
return (user, None)
自定义身份验证类有四个部分。
- 从`from rest_framework 中提供的 BaseAuthentication 类扩展它。身份验证导入 BaseAuthentication
- 有一个名为
authenticate
的方法,以request
为第一个参数。 - 返回(用户,无)元组以进行成功的身份验证。
- 为失败的身份验证引发
AuthenticationFailed
异常。这在 rest_framework.authentication 中可用。
class SecretAuthentication(BaseAuthentication):
def authenticate(self, request):
app_key = request.META.get('APP_KEY')
app_secret = request.META.get('APP_SECRET')
username = request.META.get('X_USERNAME')
try:
app = ClientApp.objects.match_secret(app_key, app_secret)
except ClientApp.DoesNotExist:
raise AuthenticationFailed('App secret and key does not match')
try:
user = app.users.get(username=username)
except User.DoesNotExist:
raise AuthenticationFailed('Username not found, for the specified app')
return (user, None)
当未经身份验证的请求被拒绝访问时,身份验证方案将返回 HTTP 403 Forbidden 响应。