Пользовательская аутентификация в Django Rest Framework

У меня есть приложение на базе django rest framework с реализованной схемой аутентификации. Теперь я хочу разрешить внешнему приложению вызывать некоторые методы моего приложения. Есть конечная точка для входа внешнего приложения /external-app-login, которая реализована следующим образом:

class ExternalAppLoginView(views.APIView):
    def post(self, request):
        if request.data.get('username') == EXTERNAL_APP_USER_NAME and request.data.get('password') == EXTERNAL_APP_PASSWORD:
            user = models.User.objects.get(username=username)
            login(request, user)
            return http.HttpResponse(status=200)
        return http.HttpResponse(status=401)

Теперь я хочу добавить аутентификацию. Я реализовал это следующим образом:

class ExternalAppAuthentication(authentication.SessionAuthentication):
    def authenticate(self, request):
        return super().authenticate(request)

Но аутентификация все время не проходит. Как правильно это сделать? Я хочу хранить логин/пароль внешнего приложения в переменных в приложении, а не в базе данных.

Аутентификация не проходит, потому что для аутентификации необходимо вернуть зарегистрированного пользователя в вашей базе данных. Однако, поскольку информация о пользователе находится в переменных, а не в базе данных, возникает проблема.

Есть несколько способов решить эту проблему. Во-первых, я бы предложил вам написать код аутентификации вместо того, чтобы использовать return super().authenticate(request), так как это приведет вас к истинной причине проблемы.

Также необходимо прочитать эту ссылку на документацию, она проясняет многие вещи, касающиеся аутентификации.

https://www.django-rest-framework.org/api-guide/authentication/

Теперь, после того как вы сделали все это, и вы ищете способы аутентификации, вы можете попробовать либо аутентификацию удаленного пользователя, либо проверить существующих пользователей в ваших переменных и использовать анонимного пользователя для аутентификации, что решит проблему.

Вернуться на верх