微信小程序python用户认证的实现


Posted in Python onJuly 29, 2019

这里用到django-rest-framework-jwt这个库   https://github.com/GetBlimp/django-rest-framework-jwt

微信小程序python用户认证的实现

按流程图来

先通过wx.login()获取code,再通过我们后台配置的接口获取openid和session_key

// 登录
 wx.login({
  success: res => {
   console.log(res)
   // 发送 res.code 到后台换取 openId, sessionKey, unionId
     wx.request({
      url: api.GET_OPENID, //
      data: {
       js_code: res.code
      },
      success: function (res) {
       var openid = res.data.openid
       var session_key = res.data.session_key
       //获取openid,session_key
       //后台用户表保存
       wx.request({
        url: api.USER,
        method: "POST",
        data: {
         openid : openid,
         session_key : session_kay
        },
        success: function (res) {
         if (res.data.status == 'success') {
          //在缓存中保存用户id和openid备用
          wx.setStorage({
           key: 'userid',
           data: res.data.userid,
          });
          wx.setStorage({
           key: 'openid',
           data: openid,
          })
         } else {
          wx.showModal({
           title: '提示',
           showCancel: false,
           content: '获取openid失败',
          })
         }
        }
       })
      }
     })
  }
 })

在这里的用户表最好是在django自带的user表上进行字段拓展,不然重写起来会很麻烦,拓展方法如下

from django.contrib.auth.models import AbstractUser

# Create your models here.
class User(AbstractUser):
  """
  用户新增字段
  """
  name = models.CharField(max_length=30, null=True, blank=True, verbose_name="姓名")

下面是django的user默认字段,需要保存用户头像,用户省市等字段只要在原有基础上新增即可

微信小程序python用户认证的实现

生成3rd session

先在后台配置jwt

安装 pip install djangorestframework-jwt

在你的settings.py,添加JSONWebTokenAuthentication到Django REST框架DEFAULT_AUTHENTICATION_CLASSES。

REST_FRAMEWORK = {
  'DEFAULT_PERMISSION_CLASSES': (
    'rest_framework.permissions.IsAuthenticated',
  ),
  'DEFAULT_AUTHENTICATION_CLASSES': (
    'rest_framework_jwt.authentication.JSONWebTokenAuthentication', # <-------
    'rest_framework.authentication.SessionAuthentication',
    'rest_framework.authentication.BasicAuthentication',
  ),
}

#JWT设置过期时间,具体配置查看文档
JWT_AUTH = {
  'JWT_VERIFY_EXPIRATION': False
}

#在您urls.py添加以下URL路由以启用通过POST获取令牌包括用户的用户名和密码。

from rest_framework_jwt.views import obtain_jwt_token
#...

urlpatterns = [
  '',
  # ...

  url(r'^api-token-auth/', obtain_jwt_token),
]

通过POST用户的用户名和密码获取token

wx.request({
         url: api.api-token-auth,//url配置
         method: 'POST',
         data: {
          'username': openid,     //这里我是用openid当作用户名
          'password': session_key   //用session_key当作密码
         },
         success: function(jwt) {
          //jwt格式:eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJ1c2VyX2lkIjoxLCJ1c2VybmFtZSI6InhpZWhhbyIsImV4cCI6MTUzNTM3ODQ2OCwiZW1haWwiOiIzNDg2OTg1ODhAcXEuY29tIn0.8rXFK_K2q8474LxYrCuuNJT93PkZMzi1JX6fVproXrE
          //前面是base64后面是签名,用.隔开
          //将jwt_token放入缓存备用
          var jwt_token = jwt.data.token
          wx.setStorageSync('jwt_token', jwt_token)
          self.globalData.jwt_token = jwt_token
         }
        })

后端配置时需要加上authentication_classes进行认证

from rest_framework.permissions import IsAuthenticated
from rest_framework_jwt.authentication import JSONWebTokenAuthentication

# 商品表
class goodsViewSet(viewsets.ModelViewSet):
  queryset = Goods.objects.all()
  serializer_class = goodsSerializers
  filter_class = GoodsFilter
  filter_backends = (DjangoFilterBackend, filters.SearchFilter)
  search_fields = ('name',)
  #认证配置
  permission_classes = (IsAuthenticated,)
  authentication_classes = (JSONWebTokenAuthentication,)

使用方法

在请求加了认证的view时,如果不在head中带入jwt_token,请求401

微信小程序python用户认证的实现

在header中带入请求数据成功

//从缓存中取出jwt_token,并按文档用法拼接,在header中带入Authorization
  // JWT +jwt_token
  var jwt_token = 'JWT ' + wx.getStorageSync('jwt_token')

  wx.request({
   url: 'http://127.0.0.1:8000/mall/goods/',
   header:{
     'Authorization': jwt_token
   },
   success:function(res){
    //成功请求到商品数据
    console.log(res)
   }
  })

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Python 相关文章推荐
python获取Linux下文件版本信息、公司名和产品名的方法
Oct 05 Python
python学习之matplotlib绘制散点图实例
Dec 09 Python
Python学生信息管理系统修改版
Mar 13 Python
python 通过xml获取测试节点和属性的实例
Mar 31 Python
Django中使用Whoosh进行全文检索的方法
Mar 31 Python
详解Python传入参数的几种方法
May 16 Python
pyqt5 从本地选择图片 并显示在label上的实例
Jun 13 Python
解决Django删除migrations文件夹中的文件后出现的异常问题
Aug 31 Python
python使用itchat模块给心爱的人每天发天气预报
Nov 25 Python
Python使用qrcode二维码库生成二维码方法详解
Feb 17 Python
python数据分析之用sklearn预测糖尿病
Apr 22 Python
Pygame Time时间控制的具体使用详解
Nov 17 Python
Python 堆叠柱状图绘制方法
Jul 29 #Python
Django处理Ajax发送的Get请求代码详解
Jul 29 #Python
Django框架视图函数设计示例
Jul 29 #Python
python内存监控工具memory_profiler和guppy的用法详解
Jul 29 #Python
Python 硬币兑换问题
Jul 29 #Python
django中使用Celery 布式任务队列过程详解
Jul 29 #Python
详解python中自定义超时异常的几种方法
Jul 29 #Python
You might like
php代码把全角数字转为半角数字
2007/12/10 PHP
PHP包含文件函数include、include_once、require、require_once区别总结
2014/04/05 PHP
PHP中$_SERVER使用说明
2015/07/05 PHP
PHP的中使用非缓冲模式查询数据库的方法
2017/02/05 PHP
记录Yii2框架开发微信公众号遇到的问题及解决方法
2018/07/20 PHP
laravel中数据显示方法(默认值和下拉option默认选中)
2019/10/11 PHP
Firefox和IE兼容性问题及解决方法总结
2013/10/08 Javascript
javascript封装简单实现方法
2015/08/11 Javascript
谈谈target=_new和_blank的不同之处
2016/10/25 Javascript
Vue如何实现组件的源码解析
2017/06/08 Javascript
详解Vue 2.0封装axios笔记
2017/06/22 Javascript
微信小程序的分类页面制作
2017/06/27 Javascript
layui将table转化表单显示的方法(即table.render转为表单展示)
2019/09/24 Javascript
[14:24]Optic Gaming vs PSG LGD BO3
2018/06/07 DOTA
[10:21]2018DOTA2国际邀请赛寻真——Winstrike
2018/08/11 DOTA
下载给定网页上图片的方法
2014/02/18 Python
Python单元测试框架unittest简明使用实例
2015/04/13 Python
用Python编写web API的教程
2015/04/30 Python
python遍历 truple list dictionary的几种方法总结
2016/09/11 Python
python 同时运行多个程序的实例
2019/01/07 Python
Appium Python自动化测试之环境搭建的步骤
2019/01/23 Python
简单了解Django应用app及分布式路由
2019/07/24 Python
Django 源码WSGI剖析过程详解
2019/08/05 Python
Python HTTP下载文件并显示下载进度条功能的实现
2020/04/02 Python
python实现扑克牌交互式界面发牌程序
2020/04/22 Python
年度献血先进个人事迹材料
2014/02/14 职场文书
中文专业自荐书
2014/06/29 职场文书
文秘应届生求职信
2014/07/05 职场文书
公司向个人借款协议书范本
2014/10/09 职场文书
房屋所有权证明
2015/06/19 职场文书
2015年初中教务处工作总结
2015/07/21 职场文书
辞职离别感言
2015/08/04 职场文书
七年级作文之环保作文
2019/10/17 职场文书
教你用Python+selenium搭建自动化测试环境
2021/06/18 Python
5道关于python基础 while循环练习题
2021/11/27 Python
基于Python编写简易版的天天跑酷游戏的示例代码
2022/03/23 Python