Как использовать простую аутентификацию jwt-токена и BasicAuthentication?

У меня есть DRF api и я реализовал систему аутентификации simplejwt. Она работает хорошо. Это полезно, когда я хочу подключить свой api из внешнего скрипта (мне не нужно хранить учетные данные и просто использовать токен).

Однако я также хочу иметь возможность использовать логин интерфейса DRF, когда я обращаюсь к своему api через браузер, поэтому я реализовал также Basic и SessionAuthentication. Хороший ли это способ сделать это?

в моем settings.py

REST_FRAMEWORK = {
    'DEFAULT_AUTHENTICATION_CLASSES': [
        'rest_framework_simplejwt.authentication.JWTAuthentication',
        'rest_framework.authentication.BasicAuthentication',
        'rest_framework.authentication.SessionAuthentication',
    ]
}

SIMPLE_JWT = {
    'ACCESS_TOKEN_LIFETIME': timedelta(days=1), 
}

в моем api views.py

from rest_framework.permissions import IsAuthenticated
from rest_framework.authentication import SessionAuthentication, BasicAuthentication
from rest_framework.decorators import permission_classes, authentication_classes

# Create your views here.
@api_view(['GET'])
#@authentication_classes([SessionAuthentication, BasicAuthentication])
@permission_classes([IsAuthenticated])
def get_all(request):
    
    # as a token is used, the user with this token is know in the requets
    user = request.user
    # show only mesures of user having the token provided
    mesures = Mesure.objects.filter(user_id=user.id)
    serializer = MesureSerializer(mesures, many=True)
    
    return Response(serializer.data)

В моем urls.py

from rest_framework_simplejwt.views import TokenObtainPairView, TokenRefreshView

urlpatterns = [
    path('mesures/', views.get_all),
    path('mesure-add/', views.add_mesure),
    path('token/', TokenObtainPairView.as_view(), name='obtain_tokens'),
    path('token/refresh/', TokenRefreshView.as_view(), name='refresh_token'),
    path('api-auth/', include('rest_framework.urls'))
]

Как вы видите, мне пришлось закомментировать декоратор @authentication_classes, чтобы он работал и с токеном, и с логином. Считаете ли вы, что это хороший способ действовать?

Вы должны быть в порядке с этим, потому что согласно документации DRF -

Поскольку теперь у нас есть набор прав доступа к API, нам необходимо аутентифицировать наши запросы к нему, если мы хотим редактировать какие-либо сниппеты. Мы не установили никаких классов аутентификации, поэтому сейчас применяются значения по умолчанию, а именно SessionAuthentication и BasicAuthentication.

Источник: Аутентификация в API

Ref: Line 109: rest_framework/views.py и Line 40: rest_framework/settings.py

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