微信小程序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完成FizzBuzzWhizz问题(拉勾网面试题)示例
May 05 Python
Python入门篇之列表和元组
Oct 17 Python
Python实现批量下载文件
May 17 Python
Python 描述符(Descriptor)入门
Nov 20 Python
python利用拉链法实现字典方法示例
Mar 25 Python
ORM Django 终端打印 SQL 语句实现解析
Aug 09 Python
django项目登录中使用图片验证码的实现方法
Aug 15 Python
Python使用itchat模块实现群聊转发,自动回复功能示例
Aug 26 Python
np.newaxis 实现为 numpy.ndarray(多维数组)增加一个轴
Nov 30 Python
解决Keras 与 Tensorflow 版本之间的兼容性问题
Feb 07 Python
Django自带的用户验证系统实现
Dec 18 Python
pytorch 带batch的tensor类型图像显示操作
May 20 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
虹吸壶煮咖啡26个注意事项
2021/03/03 冲泡冲煮
mac环境中使用brew安装php5.5.15
2014/08/18 PHP
Thinkphp连表查询及数据导出方法示例
2016/10/15 PHP
js 事件小结 表格区别
2007/08/13 Javascript
Javascript之旅 对象的原型链之由来
2010/08/25 Javascript
JavaScript 对象模型 执行模型
2010/10/15 Javascript
JavaScript的setAttribute兼容性问题解决方法
2013/11/11 Javascript
window.location.href中url中数据量太大时的解决方法
2013/12/23 Javascript
JS实现两个大数(整数)相乘
2014/04/28 Javascript
jQuery源码分析之Callbacks详解
2015/03/13 Javascript
jQuery实现的多屏图像图层切换效果实例
2015/05/07 Javascript
jQuery中$this和$(this)的区别介绍(一看就懂)
2015/07/06 Javascript
实例解析Array和String方法
2016/12/14 Javascript
jQuery实现标签子元素的添加和赋值方法
2018/02/24 jQuery
利用Console来Debug的10个高级技巧汇总
2018/03/26 Javascript
模块化react-router配置方法详解
2019/06/03 Javascript
Vue触发隐藏input file的方法实例详解
2019/08/14 Javascript
JS数组方法concat()用法实例分析
2020/01/18 Javascript
[01:04:08]完美世界DOTA2联赛PWL S3 INK ICE vs GXR 第一场 12.16
2020/12/18 DOTA
Python函数返回值实例分析
2015/06/08 Python
Python错误提示:[Errno 24] Too many open files的分析与解决
2017/02/16 Python
python: line=f.readlines()消除line中\n的方法
2018/03/19 Python
解决pycharm界面不能显示中文的问题
2018/05/23 Python
Python爬虫获取页面所有URL链接过程详解
2020/06/04 Python
Python测试框架:pytest学习笔记
2020/10/20 Python
使用Python画了一棵圣诞树的实例代码
2020/11/27 Python
Under Armour安德玛英国官网:美国高端运动科技品牌
2018/09/17 全球购物
美国在线购买和出售礼品卡网站:EJ Gift Cards
2019/06/09 全球购物
武汉某公司的C#笔试题面试题
2015/12/25 面试题
销售行政专员职责
2014/01/03 职场文书
法律专业学生的自我评价
2014/02/07 职场文书
学术诚信承诺书
2014/05/26 职场文书
商家认证委托书格式
2014/10/16 职场文书
项目投资意向书范本
2015/05/09 职场文书
辞职申请书范本
2019/05/20 职场文书
【海涛教你打dota】体验一超神发条:咱是抢盾专业户
2022/04/01 DOTA