微信小程序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之玩转字符串(2)更新篇
Sep 28 Python
Cpy和Python的效率对比
Mar 20 Python
使用python实现快速搭建简易的FTP服务器
Sep 12 Python
python Selenium实现付费音乐批量下载的实现方法
Jan 24 Python
详解Python连接MySQL数据库的多种方式
Apr 16 Python
Python任务自动化工具tox使用教程
Mar 17 Python
Python进程的通信Queue、Pipe实例分析
Mar 30 Python
在Python3.74+PyCharm2020.1 x64中安装使用Kivy的详细教程
Aug 07 Python
Python爬虫之Selenium实现关闭浏览器
Dec 04 Python
微软开源最强Python自动化神器Playwright(不用写一行代码)
Jan 05 Python
python自动化调用百度api解决验证码
Apr 13 Python
PyTorch 如何设置随机数种子使结果可复现
May 12 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中exec函数和shell_exec函数的区别
2014/08/20 PHP
php实现删除空目录的方法
2015/03/16 PHP
ECSHOP在PHP5.5及高版本上报错的解决方法
2015/08/31 PHP
php mysql_list_dbs()函数用法示例
2017/03/29 PHP
PHP编程文件处理类SplFileObject和SplFileInfo用法实例分析
2017/07/22 PHP
PHP设计模式之建造者模式定义与用法简单示例
2018/08/13 PHP
IE浏览器PNG图片透明效果代码
2008/09/02 Javascript
运用JQuery的toggle实现网页加载完成自动弹窗
2014/03/18 Javascript
node.js中的buffer.length方法使用说明
2014/12/14 Javascript
简述JavaScript对传统文档对象模型的支持
2015/06/16 Javascript
javascript封装的sqlite操作类实例
2015/07/17 Javascript
基于JavaScript判断浏览器到底是关闭还是刷新(超准确)
2016/02/01 Javascript
jquery过滤特殊字符',防sql注入的实现方法
2016/08/17 Javascript
canvas压缩图片转换成base64格式输出文件流
2017/03/09 Javascript
基于Vue的文字跑马灯组件(npm 组件包)
2017/05/24 Javascript
Vue中使用vue-i18插件实现多语言切换功能
2018/04/25 Javascript
jQuery length 和 size()区别总结
2018/04/26 jQuery
JavaScript 对引擎、运行时、调用堆栈的概述理解
2018/10/22 Javascript
vue v-for 使用问题整理小结
2019/08/04 Javascript
深入探索VueJS Scoped CSS 实现原理
2019/09/23 Javascript
Vue项目中使用flow做类型检测的方法
2020/03/18 Javascript
国内常用的js类库大全(CDN公共库)
2020/06/24 Javascript
浅谈机器学习需要的了解的十大算法
2017/12/15 Python
python 输出上个月的月末日期实例
2018/04/11 Python
深入分析python中整型不会溢出问题
2018/06/18 Python
2019 Python最新面试题及答案16道题
2019/04/11 Python
python networkx 包绘制复杂网络关系图的实现
2019/07/10 Python
python实现ftp文件传输功能
2020/03/20 Python
Pycharm制作搞怪弹窗的实现代码
2021/02/19 Python
Evisu官方网站:日本牛仔品牌,时尚街头设计风格
2016/12/30 全球购物
Shopping happy life西班牙:以最优惠的价格提供最好的时尚配饰
2020/03/13 全球购物
数字漫画:comiXology
2020/06/13 全球购物
总经理职责范文
2013/11/08 职场文书
中文专业学生自我评价范文
2014/02/06 职场文书
队列队形口号
2015/12/25 职场文书
据Python爬虫不靠谱预测可知今年双十一销售额将超过6000亿元
2021/11/11 Python