我有一个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都有效。你认为这是一个好的方法吗?
1条答案
按热度按时间3pvhb19x1#
你应该没问题因为根据DRF文件-
由于我们现在对API有一组权限,如果要编辑任何代码段,我们需要验证向它发出的请求。我们尚未设置任何验证类,因此当前应用默认值
SessionAuthentication
和BasicAuthentication
。来源:使用API进行身份验证
参考:第109行:和views.py第40行:rest_框架/settings.py