成都网站开发 Vr,外贸信托,wordpress中的搜索模板在什么地方,百度网址大全首页设为首页文章目录 一、djangorestframework-simplejwt快速使用1.基础使用步骤2.自己配置视图校验访问局部配置认证及权限类全局配置认证及权限类 3.关于双token认证问题 二、定制返回格式三、多方式登录 一、djangorestframework-simplejwt快速使用 JWT主要用于签发登录接口需要配合认证… 文章目录 一、djangorestframework-simplejwt快速使用1.基础使用步骤2.自己配置视图校验访问局部配置认证及权限类全局配置认证及权限类 3.关于双token认证问题 二、定制返回格式三、多方式登录 一、djangorestframework-simplejwt快速使用 JWT主要用于签发登录接口需要配合认证类 JWT目前有两种 Jtw和Simplejwtjwt比较老了 simple现在比较流行 1.基础使用步骤
安装建议使用pycharm可以安装到指定解释器 pip install djangorestframework-simplejwtsimplejwt默认使用auth_user表签发token所以我们直接新建项目后执行迁移命令 -makemigrations-migrate创建一个超级用户createsuperuser签发登录只需要在路由中配置(simplejwt帮我们写好了登录接口以及权限类)
路由配置 导入模块from rest_framework_simplejwt.views import token_obtain_pair, token_verify, token_refreshurlpatterns [path(login/, token_obtain_pair), # 登录 签发tokenpath(verify/, token_verify), # 验证token 是否有效path(refresh/, token_refresh), # 刷新token]settings配置 注册appINSTALLED_APPS [...rest_framework_simplejwt,...]import datetimeSIMPLE_JWT {# token有效时长ACCESS_TOKEN_LIFETIME: datetime.timedelta(minutes30),# token刷新后的有效时间REFRESH_TOKEN_LIFETIME: datetime.timedelta(days1),}此时直接访问即可它都帮我们写好了在请求体中携带刚刚创建的超级用户的账号密码就会返回token(因为是simplejwt它是双Token认证) 因为是双token认证获取到的access才是真正使用的token而refresh则是用于更新access。因为access过期时间很短过期后就需要重新生成access的token保证token的安全所以就需要使用refresh用来变更新的有效token 变更新的有效token 验证有效期token 2.自己配置视图校验访问 我们定义了一个book视图类它只允许访问时在请求头里面携带了合法的token值才能通过认证。 路由配置 from rest_framework_simplejwt.views import token_obtain_pair, token_verifyurlpatterns [path(login/, token_obtain_pair), # 登录 签发tokenpath(verify/, token_verify), # 验证token 是否有效path(refresh/, token_refresh), # 刷新token]局部配置认证及权限类
视图配置 from rest_framework.views import APIViewfrom rest_framework_simplejwt.authentication import JWTAuthenticationfrom rest_framework.permissions import IsAuthenticatedfrom rest_framework.response import Response局部配置必须配合权限类class BookView(APIView):配置的Jwt认证但是得在headers添加如果不添加的话就不会生效添加才可生效authentication_classes [JWTAuthentication] # 登录认证permission_classes [IsAuthenticated] # 配置了权限类没登录的就没有权限访问了一旦配置了去认证类和权限类后refresh的token就无法使用会显示令牌类型错误只能使用access的tokendef get(self,reqeust):return Response({测试测试})这个时候直接访问我们的接口就会发生错误detail:身份认证信息未提供因为我们访问的时候需要带上simplejwt的token固定格式为AuthorizationBearer 注意这里哟一个空格在空格后面填写签发过的token全局配置认证及权限类
settings中配置 # 全局配置REST_FRAMEWORK { 它自己内置的登录是哪怕配置了全局也不会进行认证源码中进行了禁用DEFAULT_AUTHENTICATION_CLASSES: [rest_framework_simplejwt.authentication.JWTAuthentication],DEFAULT_PERMISSION_CLASSES: [rest_framework.permissions.IsAuthenticated,],}携带登录后服务端响应给我们的token值来访问token值的开头必须是Bearer空格因为在源码内部获取校验token值前会先通过空格进行分隔一下第一个值是否为Bearer如果是的话才会获取空格后面的token值来进行校验所以我们后续会重写一些方法不需要遵守一些不必要的规则 注意只要当前的access的token没过期而之前签发的access的token和后来刷新签发的access的token都可以使用 3.关于双token认证问题 1单token-用户登录后-----签发token----但是有过期时间1.设置太短的token过期时间如3 minute后就需要重新登录体验太差一天啥事不干就重新登录2.设置太长的token过期时间如7 day7天都不需要登录-----容易被人截获到长时间使用---不安全2双token-用户登录后----签发两个token-----目前的verify检验接口只要是它签发的token都会认证通过例如access过期时间短 3分钟例如refresh过期时间长 7天-用户正常用都会用access不会用refresh-access过会有过期了一旦过期就用不了了----然后可以通过refresh这个token调用刷新接口在签发一个access的token-通过refresh再次签发的token这个过程是不需要登录的这对用户是无感知的-后续再使用access这个token发请求认证类就不能使用refresh的token 双认证的好处就是一旦access的token被别人截取到了拿着模拟发请求只能在有效时间内使用因为access的token很快会过期这样就保障安全二、定制返回格式 继承auth_user表完成签发登录但是它的返回格式太固定了只有Token但是我们想自定义格式呢 如{code: 100,msg: 登录成功,username: self.user.username,token:fdsafsfsafsadf}1.写个序列化类重写validate 返回什么前端看到什么 from rest_framework_simplejwt.serializers import TokenObtainPairSerializerclass MyTokenObtainPairSerializer(TokenObtainPairSerializer):classmethoddef get_token(cls, user):token super().get_token(user) # 签发用户token[name] user.username # 往荷载里面添加用户名称return token重写get_token方法它返回的token中就是荷载的内容def validate(self, attrs):old_data super().validate(attrs)data {code: 100,msg: 登录成功,username: self.user.username,refresh: old_data[refresh],access: old_data[access]}return data2.在settings配置文件中配置 SIMPLE_JWT {TOKEN_OBTAIN_SERIALIZER: app01.serializer.MyTokenObtainPairSerializer,}效果如下 三、多方式登录