django 如何同时使用简单的jwt令牌认证和BasicAuthentication?

7rfyedvj  于 2023-02-10  发布在  Go
关注(0)|答案(1)|浏览(161)

我有一个DRF API,我已经实现了simplejwt认证系统。它工作得很好。当我想从外部脚本连接我的api时,它很有用(我不需要存储凭据,只需要使用令牌)。
然而,我也希望能够使用DRF接口登录时,我到达我的API从浏览器,所以我已经实现了也基本和会话认证。这是一个很好的方式做到这一点?
在我的网站上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装饰器,使它对token和login都有效。你认为这是一个好的方法吗?

3pvhb19x

3pvhb19x1#

你应该没问题因为根据DRF文件-
由于我们现在对API有一组权限,如果要编辑任何代码段,我们需要验证向它发出的请求。我们尚未设置任何验证类,因此当前应用默认值SessionAuthenticationBasicAuthentication
来源:使用API进行身份验证
参考:第109行:和views.py第40行:rest_框架/settings.py

相关问题