Как использовать простую аутентификацию 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