編寫自定義身份驗證

來自 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 響應。