编写自定义身份验证

来自 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)

自定义身份验证类有四个部分。

  1. 从`from rest_framework 中提供的 BaseAuthentication 类扩展它。身份验证导入 BaseAuthentication
  2. 有一个名为 authenticate 的方法,以 request 为第一个参数。
  3. 返回(用户,无)元组以进行成功的身份验证。
  4. 为失败的身份验证引发 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 响应。