网站推广.NET

网站推广.NET

很好很强大:微信小程序dajngo后端开发

来源:互联网

不支持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天)

微信用户登录后,返回客户端令牌,并在缓存中创建用户的会话信息