不支持2个Cookie
3不支持django的内置用户登录,因为它使用微信用户系统,该系统可以使用,但通常需要重写。
对应方法:
1转到Godaddy网站申请https证书,下载并使用nginx进行指定,
3 JWT可用于确保用户的在线验证,而pyjwt可用于实现用户登录/身份验证组件
或使用django的内置用户以方便使用。 Openid是用户名,密码使用长随机数;登录时,您可以将代码直接传递给后端,后端使用该代码来更改session_info,找到openid并从中检查用户,然后手动将用户Pass传递给django-jwt生成jwt并返回小程序
jwt jsonwebtoken
是一段签名的json格式数据,它定义了一种紧凑且自包含的方法,用于以JSON对象的形式在多方之间传输信息。由于信息是经过数字签名的,因此可以进行验证和信任。 JWT可以使用密钥(使用HMAC算法),也可以使用公钥和私钥(使用RSA算法)进行签名。 *
我什么时候需要jwt
http协议是无状态的。用于前端和后端分离模式。后端倾向于面向服务。它提供了相应操作的接口,例如Restful API。它提倡无国籍。 jwt可以实现无状态。 Jwt将用户状态权限放在客户端和服务器上,并根据传递的令牌来判断它是否有权访问此资源。
jwt组成
jwt包含三部分,以。分隔:
-标头
-有效载荷
-签名(签名)
生成令牌
首先使用数组保存这三个部门,const res = [];得到这三个部分,然后使用res.join('。')生成令牌
标题
标头通常分为两部分,令牌类型和加密算法
const header={ alg:'HS256', typ:'JWT',};
然后将其序列化并将其转换为base64编码。应当注意,严格意义上讲,jwt中相应的base64并不是base64,因为令牌可以用作url,并且base64中的+ / =将转义三个字符,从而导致URL变长,因此令牌的base64会将+转换为-,/转换为_,然后删除=。
根据此规则,让我们实现生成满足要求的base64的功能:
const getBase64UrlEscape = str => ( str.replace(/\+/g, '-') .replace(/\//g, '_') .replace(/=/g, ''));const getBase64Url = data => getBase64UrlEscape( new Buffer(JSON.stringify(data)).toString('base64'));
生成标题
res.push(getBase64Url(header));
加载
const payload = { username: 'zp1996', id: 1, authority: 32};
转换为base64编码
res.push(getBase64Url(payload));
签名
签名用于使用相应的密钥对编码的标头和有效载荷进行加密
sha256( `${base64Urlencode(header)}.${base64UrlEncode(payload)}`, secret)
jwt生成签名hmac和签名的方式
const cryptoMethod = { hmac: (method, key, input) => crypto.createHmac(method, key).update(input).digest('base64'), sign: (method, input) => crypto.createSign(method).update(input).sign(key, 'base64')};
例如
const sign = (input, key, method, type) => getBase64UrlEscape( cryptoMethod[type](method, key, input));/* * payload 载荷 * key 密钥 * algorithm 加密算法 * type 采用何种类型 hmac or sign */jwt.sign = (payload, key, algorithm = 'HS256', options = {}) => { const signMethod = algorithmMap[algorithm], signType = typeMap[algorithm], header = { typ: 'JWT', alg: algorithm }, res = []; options && options.header && Object.assign(header, options.header); res.push(getBase64Url(header)); res.push(getBase64Url(payload)); res.push(sign(res.join('.'), key, signMethod, signType)); return res.join('.');};
再次分析令牌
const decodeBase64Url = str => JSON.parse( new Buffer(getBase64UrlUnescape(str), 'base64').toString());jwt.decode = (token) => { const segments = token.split('.'); return { header: decodeBase64Url(segments[0]), payload: decodeBase64Url(segments[1]) };};
使用密钥进行验证
const verifyMethod = { hmac: (input, key, method, signStr) => signStr === sign(input, key, method, 'hmac'), sign: (input, key, method, sign) => { return crypto.createVerify(method) .update(input) .verify(key, getBase64UrlUnescape(sign), 'base64'); }};
小程序登录过程
客户端请求用户授权
用户授权成功
客户端可以获取基本的用户信息(包括代码,不带openid的用户纯文本信息,带openid的加密信息,解密向量iv)
客户端将返回的信息发送到服务器
服务器使用该代码转到微信服务器,以换取session_key
服务器使用此session_key + iv解密用户的密文并获取用户的完整信息(基本+ openid)
在服务器上登录用户并维护用户会话(此处的到期时间微信同意为30天)
微信用户登录后,返回客户端令牌,并在缓存中创建用户的会话信息