微信小程序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实现多行注释的另类方法
Aug 22 Python
Python中的元类编程入门指引
Apr 15 Python
Python验证码识别处理实例
Dec 28 Python
Python中操作mysql的pymysql模块详解
Sep 13 Python
Python操作MongoDB详解及实例
May 18 Python
微信跳一跳python辅助脚本(总结)
Jan 11 Python
python print 按逗号或空格分隔的方法
May 02 Python
python绘制评估优化算法性能的测试函数
Jun 25 Python
Django项目中使用JWT的实现代码
Nov 04 Python
python打开音乐文件的实例方法
Jul 21 Python
django项目中使用云片网发送短信验证码的实现
Jan 19 Python
python三子棋游戏
May 04 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
ThinkPHP与PHPExcel冲突解决方法
2011/08/08 PHP
php简单实现屏蔽指定ip段用户的访问
2015/04/29 PHP
php用户注册信息验证正则表达式
2015/11/12 PHP
详解WordPress中给链接添加查询字符串的方法
2015/12/18 PHP
[原创]PHP获取数组表示的路径方法分析【数组转字符串】
2017/09/01 PHP
checkbox全选/取消全选以及checkbox遍历jQuery实现代码
2009/12/02 Javascript
javascript 得到变量类型的函数
2010/05/19 Javascript
js中top、clientTop、scrollTop、offsetTop的区别 文字详细说明版
2011/01/08 Javascript
JavaScript高级程序设计阅读笔记(六) ECMAScript中的运算符(二)
2012/02/27 Javascript
js遍历、动态的添加数据的小例子
2013/06/22 Javascript
JS小功能(setInterval实现图片效果显示时间)实例代码
2013/11/28 Javascript
JS解析XML实例分析
2015/01/30 Javascript
浅谈EasyUI中编辑treegrid的方法
2015/03/01 Javascript
浅谈jQuery中事情的动态绑定
2017/02/12 Javascript
完美解决input[type=number]无法显示非数字字符的问题
2017/02/28 Javascript
关于react-router的几种配置方式详解
2017/07/24 Javascript
vue 每次渲染完页面后div的滚动条保持在最底部的方法
2018/03/17 Javascript
Vue源码中要const _toStr = Object.prototype.toString的原因分析
2018/12/09 Javascript
手把手教你 CKEDITOR 4 扩展插件制作
2019/06/18 Javascript
[05:36]DOTA2 2015国际邀请赛中国区预选赛第四日TOP10
2015/05/29 DOTA
[48:11]完美世界DOTA2联赛 Magma vs GXR 第二场 11.07
2020/11/10 DOTA
[03:17]DOTA2-DPC中国联赛1月29日Recap集锦
2021/03/11 DOTA
Python使用PDFMiner解析PDF代码实例
2017/03/27 Python
Python实现合并同一个文件夹下所有txt文件的方法示例
2018/04/26 Python
python的scikit-learn将特征转成one-hot特征的方法
2018/07/10 Python
python 读取dicom文件,生成info.txt和raw文件的方法
2019/01/24 Python
简单了解python单例模式的几种写法
2019/07/01 Python
tensorflow 实现数据类型转换
2020/02/17 Python
自学python用什么系统好
2020/06/23 Python
一款利用css3的鼠标经过动画显示详情特效的实例教程
2014/12/29 HTML / CSS
婚纱摄影师求职信范文
2014/04/17 职场文书
公司外出活动方案
2014/08/14 职场文书
竞选班干部演讲稿400字
2014/08/20 职场文书
2014年群众路线教育实践活动整改措施
2014/09/24 职场文书
北京故宫的导游词
2015/01/31 职场文书
高中生自我评价范文2015
2015/03/03 职场文书