RESTFramework身份验证机制是将传入请求与一组标识凭据(例如,请求来自的用户或与签名令牌)相关联的机制,使用权限和限制策略凭据确定是否应允许该请求。
请求身份凭证将不会允许携带身份凭证,只仅仅是标识发出请求的凭据信息。
这种方法比JWT等其他流行方法更简单(也更安全),并且只有一个要求:你的前端(想想Vue.js、React等)和你的后端应该由同一个域提供服务。
Authentication优势
JWT(JsonWebToken)是一种非常流行的在API中提供身份验证的方法。如果正在开发一个以Vue.js或React作为前端,DjangoRestFramework作为后端的现代Web应用程序,很有可能将JWT视为实现身份验证的最佳方法。
现实情况是JWT只是一种方法,不幸的是其使用不简单,也不是最可靠的。JWT在DjangoRestFramework中不受开箱即用的支持,并且需要为项目提供额外的库和额外的配置。
基础设置
身份验证方案始终定义为类列表,Restframework将尝试对列表中的每个类进行身份验证。
并设置quest.user和quest.auth为成功进行身份验证的第一个类的返回值,如果没有任何类通过身份验证,quest.user则将设置为django.contrib.auth.models.AnonymousUser的实例,并将quest.auth设置为None。
未认证请求的quest.user和quest.auth可以使用UNAUTHENTICATED_USER和UNAUTHENTICATED_TOKEN设置进行修改。
setting.py中添加身份验证内容。
DEFAULT_AUTHENTICATION_CLASSES配置了Django会话来验证用户。DEFAULT_PERMISSION_CLASSES要求只有经过身份验证的用户才能访问端点。
REST_FRAMEWORK={DEFAULT_AUTHENTICATION_CLASSES:[st_framework.authentication.SessionAuthentication,],DEFAULT_PERMISSION_CLASSES:[st_framework.permissions.IsAuthenticated,],}
身份验证端点示例
创建serializers.py
序列化程序定义了两个用于身份验证的字段(用户名和密码)进行身份验证。
fromdjango.contrib.authimportauthenticatefromst_frameworkimportserializersclassLoginSerializer(serializers.Serializer):username=serializers.CharField(label="Username",write_only=True)password=serializers.CharField(label="Password",#启用DRF可浏览API时使用style={input_type:password},trim_whitespace=False,write_only=True)defvalidate(self,attrs):#获取用户名和密码username=attrs.get(username)password=attrs.get(password)ifusernameandpassword:#使用Django身份验证框架对用户进行身份验证user=authenticate(quest=self.context.get(quest),username=username,password=password)ifnotuser:#用户不存在引发异常msg=用户名或密码错误。raiseserializers.ValidationError(msg,code=authorization)else:msg=用户名和密码都是必须的。raiseserializers.ValidationError(msg,code=authorization)#合法的用户,把它放在序列化器的validated_data用于views视图使用attrs[user]=userturnattrs
views.py
登录视图中使用这个序列化程序。
fromst_frameworkimportpermissionsfromst_frameworkimportviewsfromst_framework.sponseimportResponsefrom.importserializersclassLoginView(views.APIView):#未经身份验证的用户也应该可以访问功能permission_classes=(permissions.AllowAny,)defpost(self,quest,format=None):serializer=serializers.LoginSerializer(data=self.quest.data,context={quest:self.quest})serializer.is_valid(raise_exception=True)user=serializer.validated_data[user]login(quest,user)turnResponse(None,status=status.HTTP__ACCEPTED)
urls.py
路由设置。
fromdjango.contribimportadminfromdjango.urlsimportpathfromusersimportviewsurlpatterns=[path(admin/,admin.site.urls),path(login/,views.LoginView.as_view()),]
创建用户启动服务
pythonmanage.pymigratepythonmanage.pycatesuperuserpythonmanage.pyrunserver0.0.0.0:
HTTPIE测试身份验证