一家只做正品的网站,电影宣传网站模板免费下载,居然之家设计家官网,添加网站描述概述 cookie、session 与token 的区别
Cookie的作用
cookie的存储量很小#xff0c;一般不超过4Kcookie并不会保存很多信息#xff0c;一般用来存储登录状态cookie是以键值对进行表示的(keyvalue),例如nameli,表示cookie的名字是name,cookie携带的值是licookie的存储分为会…概述 cookie、session 与token 的区别
Cookie的作用
cookie的存储量很小一般不超过4Kcookie并不会保存很多信息一般用来存储登录状态cookie是以键值对进行表示的(keyvalue),例如nameli,表示cookie的名字是name,cookie携带的值是licookie的存储分为会话存储和持久性存储如果cookie会话性那么cookie仅会保存在客户端内存中当我们关闭客户端时cookie就会失效如果cookie为持久性那么cookie会保存到硬盘中直至生存期结束或者用户主动将其销毁
Session是什么
在网络应用中成为会话控制Session用来存储特定用户会话所需的属性及配置等信息session保存的位置在服务端
为什么需要session
我们目前使用的互联网应用层协议基本上都是基于HTTP和HTTPSHTTP和HTTPS是无状态的只负责请求和响应所以导致如果没有额外处理的话服务器是不知道你是谁更无法根据你是谁给你展现和你相关的内容
cookie存储在客户端session存储在服务端浏览器请求时将cookie携带至后端服务端根据cookie中的关键信息找到对应的session,用来保持会话
什么是token
token其实就是一段加密的字符串一般由身份标识时间戳用户必要信息等内容组成tonken的传输就是一个加密和解密的过程
可以看到 服务端是不保存token的
JWT–JsonWebToken 实现原理
jwt eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6IkpvaG4gRG9lIiwiaWF0IjoxNTE2MjM5MDIyfQ.SflKxwRJSMeKKF2QT4fwpMeJf36POk6yJV_adQssw5c它是一个由.连接组成的三段字符串
服务端加密的过程
第一段字符串 是头信息头信息包含算法和算法类型这部分字符串由头信息进行base64加密得到的它是token的第一段字符串
第二段字符串 是我们自己定义或者存储的一些信息可以包含用户名过期时间等然后对此进行base64加密得到token第二段字符串
第三段字符串
第一段base64加上一个.然后加上第二段base64再加上“密钥”然后再来一个base64最后生成了token第三段字符串
以上3段字符串通过.进行连接生成最后的token返回给客户端
服务端解密的过程 可以从url中得到用户传递过来的token:requestGET.get(“token”)
第一部分我们用base64解密得到头信息 第二部分我们用base64解密得到自己再token中存储的数据 第三部分把第一个部分加第二部分内容再加上我们自己的密钥进行base64加密得到一个base64字符串最后用这个字符串和用户传递的第三部分进行比较
DRF-JWT 用户登录认证实现一
user/views
class LoginView(GenericAPIView):def post(self,request):return_data {}request_data request.dataemail request_data.get(username)user_data User.objects.get(emailemail)if not user_data:return ResponseMessage.UserResponse.other(用户名或者是密码错误1)else:user_ser UserSerializer(instanceuser_data,manyFalse)# 用户输入的密码user_password request_data.get(password)md5_user_password get_md5(user_password)print(md5_user_password)# 数据库的密码db_user_password user_ser.data.get(password)print(db_user_password)if md5_user_password ! db_user_password:return ResponseMessage.UserResponse.other(用户名或者是密码错误2)else:token_info {username:email}token_data create_token(token_info)return_data[token] token_datareturn_data[username] user_ser.data.get(name)return ResponseMessage.UserResponse.success(return_data)user/urls
path(login, LoginView.as_view()),utils/jwt_auth.py
import datetimeimport jwt
from rest_framework.authentication import BaseAuthenticationfrom muxi_shop_back.settings import SECRET_KEYdef create_token(payload,timeout1):headers {alg:HS256,typ:jwt}payload[exp] datetime.datetime.utcnow() datetime.timedelta(minutestimeout)result jwt.encode(headersheaders,payloadpayload,keySECRET_KEY,algorithmHS256)return resultdef get_payload(token):result {status:False,data:None,error:None}try:payload jwt.decode(token,SECRET_KEY,algorithms[HS256])result[status] Trueresult[data] payloadexcept jwt.exceptions.DecodeError:print(token认证失败了)result[error] token认证失败了except jwt.exceptions.ExpiredSignatureError:print(token已经失效了)result[error] token已经失效了except jwt.exceptions.InvalidTokenError:print(无效的、非法的token)result[error] 无效的、非法的tokenreturn result# 用户在url中进行token的参数配置
class JwtQueryParamAuthentication(BaseAuthentication):def authenticate(self, request):# 从url中拿到tokentoken request.GET.get(token)result_payload get_payload(token)print(result_payload)return (result_payload,token)class JwtHeaderAuthentication(BaseAuthentication):def authenticate(self, request):# 从头信息中拿到tokentoken request.META.get(HTTP_TOKEN)print(token)result_payload get_payload(token)print(result_payload)return (result_payload,token)测试一下 比如执行某个类下面的方法之前都会先获取token验证其是否失效 这里验证地址列表,通过url传递token 先登录获取token 获取地址列表
同时终端也打印了信息说明方法被调用了 utils/jwt_auth.py 再次请求token就失效了所以我们可以request.user.get(“status”) 判断用户登录状态是否失效
address/views
把定义的验证类加在该方法下表明访问即验证token
class AddressListGenericAPIView(GenericAPIView,ListModelMixin):queryset UserAddress.objectsserializer_class AddressSerializerauthentication_classes [JwtQueryParamAuthentication, ]def get(self, request):# 拿到token验证返回的第一个值print(request.user)# 拿到token返回的第二个值print(request.auth)# 加该逻辑即进行验证if not request.user.get(status):return JsonResponse(request.user, safeFalse)return self.list(request)DRF-JWT 头信息传递的token验证 utils/jwt_auth.py
class JwtHeaderAuthentication(BaseAuthentication):def authenticate(self, request):# 从头信息中拿到tokentoken request.META.get(HTTP_TOKEN)print(token) DRF-JWT-Token 的全局配置
settings # 全局的token验证配置
REST_FRAMEWORK {DEFAULT_AUTHENTICATION_CLASSES:[utils.jwt_auth.JwtQueryParamAuthentication]
}测试 只需要加这两行代码就行
不加的不影响