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

作者:weidwonder

链接:https://www.jianshu.com/p/c1c5b1f641b1

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

  1. 用 Django 开发微信小程序后端实现用户登录

    本文将介绍采用 Django 开发微信小程序后端,通过将用户模块进行重构,并采用JWT来进行用户认证,来解决以下问题: 微信小程序不支持 Cookie,因此不能采用 Django 默认的 Sessio ...

  2. Django开发微信公众号

    一.微信公众号的准备: 1. 注册 访问地址:https://mp.weixin.qq.com/  按照提示注册即可  注意:本文样例使用个人公众号,由于个人公众号没有接口权限,自定义菜单无法进行开发 ...

  3. python微信小程序后端开发_使用django开发微信小程序后端

    tips: 本文面向的对象是已经会使用django开发web后端的人员 微信小程序后端与普通web的区别 微信小程序的后端开发和普通的restful API 大致上相同,只不过要注意以下几点限制 必须 ...

  4. Django 开发微信公众号

    其实这个功能一早就完成了,但是直到今天才有空把它记录下来~~ 准备工作 在正式开始之前,需要做一些准备: a: 安装好wechat_sdk(怎么安装请看我前面写<<基于Django的微信公 ...

  5. 指定应用程序网络连接_总结Java开发Web应用程序应该理解的几个知识点

    前言 前面我们对Web应用开发的底层技术做了一些串联,也就是从应用程序的本质出发来理解为什么我们的应用程序架构的演变. 特别是Spring框架的出现,它在Web应用开发中扮演的角色,特别是Servle ...

  6. qt程序使用多行linux命令,开发Qt应用程序的基本方法总结

    在开发Qt4应用程序时,有几种常见的做法. 1.全部采用手写代码,在命令行下完成编译和运行 这种方式是最基础.最基本的,使用它的感觉有点像练武术时的扎马步,一招一式非常清楚.它最锻炼开发者的技能,因为 ...

  7. Python 3.6+Django开发入门小案例(自动变化的问候)完整步骤

    第一步:在命令提示符环境使用pip install django命令安装django 第二步:在命令提示符环境使用python django-admin.py startproject django_ ...

  8. Django开发日记(前后端不分离,使用Templates模板)

    1.Django:NoReverseMatch: Reverse for 'xxx' not found . 'xxx' is not a valid view function or pattern ...

  9. 用Django开发Web应用程序异常

    2019独角兽企业重金招聘Python工程师标准>>> 我们建立mysite的Django项目时,要运行Web服务器先cd -/mysite后,下一行要在manage.py runs ...

  10. Django开发微信公众平台

    处理微信发来的信息,实际上就是处理xml的过程.先写xml工具类 # -*- coding:utf-8 -*- from xml.dom import minidom from Web.model.W ...

最新文章

  1. 虚拟服务器磁盘满了咋办,虚拟主机磁盘空间不够用怎么办?
  2. Python语言的应用领域
  3. ORA-600 [kddummy_blkchk] [18038] 一例
  4. Java IO在Android中应用(三):Apk加固去壳
  5. 计算机专业勤学善思感悟,勤学善思作文600字
  6. linux下使用make指令生成程序时提示“XXX is up to date”问题的解决办法
  7. Web自动化测试 Selenium+Eclipse+Junit+TestNG+Python
  8. 设计模式(2)--Singleton(单例模式)--创建型
  9. 资源 | Deeplearning.ai课程与笔记汇总
  10. 鲸准2020年度产业投资白皮书
  11. Python之网络编程(Socket)
  12. 记载abp中Dbcontext的疑问
  13. Django简单介绍-基础1
  14. Visual Studio Code中的无标题(工作区)
  15. 证明华为模拟器Wvrp5.2a的二三层可以通信的trunk实验
  16. 从Android support到Androidx
  17. Discuz X3.4版块规则支持html代码修改
  18. sql时间转换时分秒_sql时间格式转换yyyymm
  19. c语言字段宽度,2.6.3 控制输出的字段宽度
  20. 大一计算机知识总结,大学计算机基础超详细知识点(高手总结)免费

热门文章

  1. etal斜体吗 参考文献_期刊论文的参考文献格式
  2. MIMO系统信号检测之MMSE推论
  3. html转pdf手机,html转pdf
  4. 计算机运算实际运算的误差,误差
  5. Emmagee性能测试简单的使用
  6. android 分区 加密软件,VeraCrypt(硬盘分区加密软件)
  7. 小米5X手机IMEI成0
  8. 将高分三号中的SAR图可视化处理
  9. 阿里云中标“金关工程二期”大数据云项目,总金额8568万!(含标单)
  10. 交叉熵和相对熵(KL散度)