微信小程序> Django作为微信小程序后端实践-微信小程序后端-微信小程序后端JAVA

Django作为微信小程序后端实践-微信小程序后端-微信小程序后端JAVA

浏览量:2483 时间: 来源:凤凰人
前言1.

小程序作为轻量级的应用,具有开发周期短,能快速迭代的优点,而且还能借助大厂的流量入口,迅速导入用户。这也大概是为啥一些创业公司和团队喜欢用小程序进行产品的快速迭代的原因的。小程序快速的迭代,势必要求后端也能跟得上迭代的进度,因此选择一些优秀成熟的框架是必须的。最近公司需要快速开发一款小程序产品进行试水,给的周期比较短,工作量比较大,就一个后端从框架的搭建到数据库设计、逻辑实现、小程序的配置、服务器的部署、上线等工作均后端完成。综合考虑各种成本因素及用户量的规模,于是就敲定了使用Django作为后端框架。

对比小程序后端开发与普通Web开发的区别2.

主要有以下三点区别

小程序中必须使用HTTPS协议请求后端服务器。在小程序中不支持Cookie存储。小程序不支持Django内置的user登录,因为它使用的是微信用户系统。3.

应对以上三种问题的解决方案

对于https协议的限制,可以去申请https证书,一般云服务器厂家提供免费申请证书的入口,也可以自己生成证书;生成证书后在nginx配置文件中指定就行。这里有篇文章《nginx使用ssl模块配置HTTPS支持》可参考;小程序不支持Cookie,将导致Django原生的Session机制失效。小程序使用的的是微信的用户系统,所以不支持直接使用Django的内置user登录。4.

为了解决上面的2,3问题,可以选择使用JWT来保证用户的在线认证,关于JWT的的细节,将会出文章进行具体说明。简单来说,原先保存在cookie里面的一个随机的session变成保存在https头部的Authorization字段的一个token值(服务端自身加密的,客户端无需解密,只要服务端知道这个token对应这个用户就行)。

5.

在后端层面具体做法是将openid做用户名(唯一),密码用长随机数;登录时用直接把code传到后端,后端拿着code换session_info,从里面找到openid查user,然后把user传给django-jwt,手动生成jwt返回小程序;

关于小程序的登录流程6.

小程序可以通过微信官方提供的登录能力方便地获取微信提供的用户身份标识,快速建立小程序内的用户体系。

7.

由上图可以知道微信小程序的登录步骤可以描述为(客户端指的就是小程序):

客户端请求用户授权(wx.login())用户同意并授权成功;客户端获得到用户基本信息(包括code,有openid的加密后的信息,解密向量iv)客户端把返回的信息发送到服务器服务器使用code去微信服务器换取session_key服务器用这个session_key+iv去解密用户密文,得到用户完整信息(基本信息+openid)8.

相关的名词及函数解释

9.

code临时登录凭证,有效期五分钟,通过wx.login()获取

10.

session_key会话密钥,服务端通过code2Session获取

11.

openId用户在该小程序下的用户唯一标识,永远不变,服务端通过code获取

12.

unionId用户在同一个微信开放平台帐号(公众号,小程序,网站,移动应用)下的唯一标识,永远不变

13.

appId小程序唯一标识

14.

appSecret小程序的appsecret,可以和code,appId一起换取session_key

15.

rawData不包括敏感信息的原始数据字符串,用于计算签名

16.

encryptedData包含敏感信息的用户信息,是加密的

17.

signature用于校验用户信息是否无篡改

18.

iv加密算法的初始向量

19.

如何加密解密,可以结合官方文档进行;可以借用成熟的python插件进行,这里不再详细赘述,关于如何生成jwt_token这里简单说明一下:

在setting的配置文件中重写JWT_RESPONSE_PAYLOAD_HANDLERJWT_AUTH{'JWT_EXPIRATION_DELTA':datetime.timedelta(days7),#JWT有效期'JWT_RESPONSE_PAYLOAD_HANDLER':'users.utils.jwt_response_payload_handler'}20.

其中jwt_response_payload_handler方法定义如下:

defjwt_response_payload_handler(token,userNone,requestNone):"""自定义jwt认证成功返回数据"""return{'token':token,'user_id':user.id,'username':user.username}在解密用户数据后,生成JWTTokenjwt_payload_handlerapi_settings.JWT_PAYLOAD_HANDLERjwt_encode_handlerapi_settings.JWT_ENCODE_HANDLERpayloadjwt_payload_handler(user)jwt_tokenjwt_encode_handler(payload)21.

说明:后面我将会在自己个人博客更新博文,欢迎光顾个人网站

版权声明

即速应用倡导尊重与保护知识产权。如发现本站文章存在版权问题,烦请提供版权疑问、身份证明、版权证明、联系方式等发邮件至197452366@qq.com ,我们将及时处理。本站文章仅作分享交流用途,作者观点不等同于即速应用观点。用户与作者的任何交易与本站无关,请知悉。

  • 头条
  • 搜狐
  • 微博
  • 百家
  • 一点资讯
  • 知乎