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

前言

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

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

主要有以下三点区别

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

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

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

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

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

关于小程序的登录流程

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

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

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

相关的名词及函数解释

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

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

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

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

  • appId 小程序唯一标识

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

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

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

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

  • iv 加密算法的初始向量

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

  1. 在setting的配置文件中重写JWT_RESPONSE_PAYLOAD_HANDLER
JWT_AUTH = {
    'JWT_EXPIRATION_DELTA': datetime.timedelta(days=7),  # JWT有效期
    'JWT_RESPONSE_PAYLOAD_HANDLER': 'users.utils.jwt_response_payload_handler'
}

其中jwt_response_payload_handler方法定义如下:

def jwt_response_payload_handler(token, user=None, request=None):
    """自定义jwt认证成功返回数据"""
    return {
        'token': token,
        'user_id': user.id,
        'username': user.username
    }
  1. 在解密用户数据后,生成JWT Token
  jwt_payload_handler = api_settings.JWT_PAYLOAD_HANDLER
  jwt_encode_handler = api_settings.JWT_ENCODE_HANDLER
  payload = jwt_payload_handler(user)
  jwt_token = jwt_encode_handler(payload)

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

©️2020 CSDN 皮肤主题: 技术黑板 设计师: CSDN官方博客 返回首页
实付0元
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、C币套餐、付费专栏及课程。

余额充值