tips: 本文面向的对象是已经会使用django开发web后端的人员

微信小程序后端与普通web的区别

微信小程序的后端开发和普通的restful API 大致上相同,只不过要注意以下几点限制

必须使用HTTPS协议请求后端服务器

不支持COOKIE

不支持django内置的user登录, 因为它使用的是微信的用户系统

应对方法

对于HTTPS的限制, 很简单, 去godaddy等网站申请一个https证书, 下载后使用nginx指定即可, 可以参照此文章, 这篇文章的证书是自己生成的, 这里需要替换为申请的证书

不支持cookie, django原生的session机制就会失效

不支持django内置的user登录, 因为它使用的是微信的用户系统

对于上边这两个问题,我使用了JWT来保证了用户的在线验证. 那么什么是JWT呢, 可以看下推酷的这篇文章了解一下, 简要的来说就是用户登录以后, 原先保存在cookie里边的一个随机的sessionid变成了保存在http头部的Authorization字段的一个token值, 这个值是服务端自身加密的, 客户端无需解密, 只要服务端知道这个token对应这个用户就好, 当然这里也有很多的附加功能, 比如超时等等, 不再赘述

然而网上有很多的jwt开源项目, 比如django-jwt, rest-framework-jwt, 你都可以使用, 但是却不适用于微信小程序, 为什么这么说? 是因为这两个项目都和django内置的user相耦合, 在上边提出的第三个问题的地方会引起问题, 在尝试了rest-framework-jwt发现问题后, 我毅然决定自己使用pyjwt实现一个用户登录/鉴权的组件.

首先要知道微信小程序的登录流程是:

客户端请求用户授权

用户授权成功

客户端或得到用户基本信息(包括code,没有openid的用户明文信息, 有openid的加密后的信息, 解密向量iv)

客户端把返回的信息发送到服务器

服务器使用code去微信服务器换取session_key

服务器用这个session_key+iv去解密用户密文, 得到用户完整信息(基本+openid)

将用户在服务器登录, 维持用户session(这里的失效时间微信约定是30天)

看起来好像步骤很多, 但是我们没有必要去重新造轮子, 早有人已经写好认证流程python-weixin我们可以省去4-6的步骤, 那么剩下的问题就是如何解决第7步也就是维持session的问题了.

因为jwt始终使用http头部的token进行验证这里我的思路是:

微信用户登录后, 返回客户端token, 并在缓存创建用户的session信息

客户端请求时附加http头Authorization=JWT

使用中间件检验http头的token, 审查通过则在request上追加一个jwt_user属性(这里不想覆盖django自带user), 同时去缓存寻找这个用户的session信息, 加载到request.jwt_session, 审查如果不通过则jwt_user设置为None, jwt_session为一个空的session对象

使用认证方法, 对于需要进行登录的接口检验用户是否为None

到这一步就已经完成了整个的用户鉴权/session持久化流程, 如果你只是为了了解django开发小程序注意的点到这里已经可以结束了, 下边我要介绍的是我实现的一套中间件逻辑, 有兴趣可以拿去直接使用.

这里中间件我已经实现了参见django-jwt-session-auth, 调用模块内部的jwt_login函数, 登录你的用户时会返回一个token, 这个token将要返回客户端, 同时它也会做user的session缓存动作.下一次客户端带着Authorization=JWT 调用的时候中间件会直接将对应的user和session加载到request.jwt_user和request.jwt_session, 这里你需要设置的只有设置两个值: USER_TO_PAYLOAD和PAYLOAD_TO_USER两个方法:

* USER_TO_PAYLOAD: 根据当前登录的用户生成一个字典payload方法

* PAYLOAD_TO_USER: 根据你之前生成的payload找到对应的用户

注: 2017.1.15我这个组件还没有完整的readme, 后续会加上

最后, 关于认证器, 如果你使用rest-framework可以直接继承BaseAuthentication在authenticate方法里校验jwt_user是否为None即可, 如果直接使用django原生的view, 可以写一个装饰器装饰在类view的dispatch方法上或直接装饰在函数的view上.

示例

# django-jwt-session-auth设置, 放在settings.py文件中

JWT_AUTH = {

'PAYLOAD_TO_USER': 'user.auth.payload_to_user',

'USER_TO_PAYLOAD': 'user.auth.user_to_payload',

}

# rest-framework验证器

class WechatUserAuthentication(BaseAuthentication):

def authenticate(self, request):

if not request.jwt_user:

msg = u'请先授权'

raise exceptions.AuthenticationFailed(msg)

return (request.jwt_user, request.jwt_user.uuid)

# 原生django验证装饰器

def login_required(func):

@wraps(func)

def verify_login(request, *args, **kwargs):

if request.jwt_user:

return func(request, *args, **kwargs)

else:

# 返回HTTP_401

return verify_login

python微信小程序后端开发_使用django开发微信小程序后端相关推荐

  1. 为什么java下载安装程序很慢_【关注】微信小程序开发和APP开发的10种区别!

    在移动互联网大火的时代,APP和微信小程序已经成为了企业从移动端获取用户流量,实现盈利的重要端口. 因为微信小程序体积小,操作方便,省去了下载安装这一操作,导致这两年微信小程序的势头是越来越猛,甚至有 ...

  2. 小程序 数据库 时间_使用云开发数据库构建更生动的小程序

    导语 长连接服务被广泛应用在消息提醒.即时通讯.推送.直播弹幕.游戏等场景.本篇文章将介绍云开发数据库的长连接服务--实时数据推送,使用它来构建更生动的小程序.什么是实时数据推送? 通过云开发数据库的 ...

  3. python开发前端后端区别_一文看懂前端和后端开发

    作为一名开发者,你可能会想:2019 年最好的软件开发技术和编程语言会是什么?它们又是如何被应用在软件开发当中的?如果你在思考这个问题,那就来对地方了.这篇文章将对前端和后端开发技术做一个对比,先从基 ...

  4. 微信商城小程序怎么做_分享实体店做微信商城小程序制作步骤

    各行各业都在用微商城小程序开店,不管是餐饮店还是便利店,还是五金店.都是可以利用微信小程序开一个线上店铺.实现线上跟线下店铺更加全面的结合.维护好自己的老客户.让您的客户给您拉新,带来新客户. 小程序 ...

  5. 拼团小程序源码_摄影类拼团小程序怎么开发?

    过去,摄影行业都是线下实体店为主,宣传手段单一.推广效率差,客户复购率更是不怎样.随着微信小程序的出现,各个摄影行业商家开始通过小程序来进行推广,连接线上线下场景,这样便能触达更多消费者. 小程序拥有 ...

  6. 单片机拼字程序怎么做_餐饮怎么用微信小程序?餐饮行业怎么做小程序

    随着移动互联网的发展,互联网+餐饮这种新型餐饮模式已经发展到了很成熟的地步.很多餐厅都会觉得,自己的活动很有吸引力,但是推广力度不够,不能迅速营造人气,提升收益.对于餐饮人来说,微信是主要的传播渠道, ...

  7. 微信小程序收款手续费_为什么有人做的小程序交易手续费是0.38%而不是0.6%?

    有些商家在了解小程序制作过程中,会遇到关于交易手续费是千分之六还是千分之三点八的问题,这两种费率差距还是比较大的. 举个例子:当您一年成交额是1000万时,6‰和3.8‰可以差22000元呢! 尤其是 ...

  8. 拼团小程序源码_拼团软件微信拼团小程序拼团卖水果、让您快速引流

    微信作为国内最大的社交平台,已经拥有11亿的用户,成为社交电商最主要的流量平台.从电商商家到线下门店,从品牌商到个体户,大家都想瓜分微信平台的流量.同时,微信也在不断完善小程序在各业务场景中的接口,开 ...

  9. 扫码点餐小程序源码_扫码点餐小程序有什么用?怎么制作?

    现在小程序扫码点餐服务已经越来越普及,当用户需要点餐时,无需麻烦服务人员,只需扫描餐桌上或者海报上的小程序码,就能快速点餐下单.这样不仅节约了排队时间,也提高了商家自己的服务效率. 上线了小程序案例, ...

最新文章

  1. Java代码安装maven jar,maven添加第三方的jar包
  2. 这几本豆瓣高分设计好书,人人都应该读!
  3. c语言字符串转64位哈希值,对字符串进行hash处理用什么方法好???
  4. 每日一皮:阅读软件许可协议让你想到了什么?
  5. python打开figure对象_Python ——绘图 plt.figure()的使用
  6. c# 操作redisclient 设置过期时间_C# Redis分布式锁单节点
  7. WinForm 快捷键设置
  8. oracle转mysql总结,原理+实战+视频+源码
  9. datatable相同列合并_使用Power Query合并查询
  10. Atitit table的读取与遍历 jquery jsoup 目录 1. atitit.gui控件的定位与选择器 1 2. 读取表格流程 遍历表格table 1 3. W3cdom标准化 1
  11. Android开发之SharedPreferences
  12. raid控制器缓存和硬盘缓存
  13. 关于KNX/IP 网关协议报文解析以及几个注意事项
  14. pdf分割拆分——speedpdf帮您免费在线将PDF拆分成多个文件
  15. 高中数学数列解题:技巧数列大题—错位相减
  16. vmware 14 安装centOS 7时,出现Network boot from Intel E1000
  17. 《Linuxnbsp;Kernelnbsp;Development》读书…
  18. 通达信主窗口显示股票所属板块及概念语句
  19. 求n的阶乘的算法框图_算法——递归问题
  20. 单细胞转录组分析R包安装

热门文章

  1. JAVA计算机毕业设计都市书城系统Mybatis+系统+数据库+调试部署
  2. el-input禁止输入特殊字符以及对输入框做其他限制
  3. Win10修复引导Win7
  4. etcdctl cluster-health 出现 cluster may be unhealthy: failed to list members
  5. 商业地产研策如何搜集数据​
  6. 阿里云RDS 批处理定时导出备份 并压缩归档
  7. 【苹果相册共享】推送群发安装软件1G内存 // Late 2011
  8. 《都挺好》告诉我们:这些人生道理,每个人都必须要懂
  9. 【vue】vue-Router 常见面试题
  10. pr第一次培训笔记(新建项目,序列及预设)