微信小程序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统计文件行数示例分享
Feb 21 Python
Django集成百度富文本编辑器uEditor攻略
Jul 04 Python
利用Python绘制数据的瀑布图的教程
Apr 07 Python
MySQL最常见的操作语句小结
May 07 Python
python爬虫实战之爬取京东商城实例教程
Apr 24 Python
Python实现统计代码行的方法分析
Jul 12 Python
修改默认的pip版本为对应python2.7的方法
Nov 06 Python
详解python3 + Scrapy爬虫学习之创建项目
Apr 12 Python
对Python中一维向量和一维向量转置相乘的方法详解
Aug 26 Python
Python偏函数实现原理及应用
Nov 20 Python
matplotlib交互式数据光标实现(mplcursors)
Jan 13 Python
详解Python中*args和**kwargs的使用
Apr 07 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 无限极分类
2008/03/27 PHP
php str_pad 函数用法简介
2009/07/11 PHP
PHP实现多图上传(结合uploadify插件)思路分析
2016/11/30 PHP
支持汉转拼和拼音分词的PHP中文工具类ChineseUtil
2018/02/23 PHP
PHP实现负载均衡下的session共用功能
2018/04/17 PHP
解决windows上php xdebug 无法调试的问题
2020/02/19 PHP
PHP设计模式(六)桥连模式Bridge实例详解【结构型】
2020/05/02 PHP
javscript对象原型的一些看法
2010/09/19 Javascript
jquery模拟SELECT下拉框取值效果
2013/10/23 Javascript
javascript验证身份证完全方法具体实现
2013/11/18 Javascript
屏蔽IE弹出&quot;您查看的网页正在试图关闭窗口,是否关闭此窗口&quot;的方法
2013/12/31 Javascript
防止登录页面出现在frame中js代码
2014/07/22 Javascript
JavaScript中iframe实现局部刷新的几种方法汇总
2016/01/06 Javascript
JavaScript sort数组排序方法和自我实现排序方法小结
2016/06/06 Javascript
Node.js中.pfx后缀文件的处理方法
2017/03/10 Javascript
JavaScript箭头函数_动力节点Java学院整理
2017/06/28 Javascript
Element Tooltip 文字提示的使用示例
2020/07/26 Javascript
javascript实现图片轮换动作方法
2020/08/07 Javascript
[13:38]2015国际邀请赛中国战队出征仪式
2015/05/29 DOTA
[03:12]完美世界DOTA2联赛PWL DAY6集锦
2020/11/05 DOTA
python实现合并两个数组的方法
2015/05/16 Python
PyCharm使用教程之搭建Python开发环境
2016/06/07 Python
20招让你的Python飞起来!
2016/09/27 Python
selenium python浏览器多窗口处理代码示例
2018/01/15 Python
python 输出所有大小写字母的方法
2019/01/02 Python
Python OpenCV 调用摄像头并截图保存功能的实现代码
2019/07/02 Python
Tensorflow 实现分批量读取数据
2020/01/04 Python
马德里著名的运动鞋商店:NOIRFONCE
2019/04/12 全球购物
2019年分享net面试的经历和题目
2016/08/07 面试题
幼儿师范毕业生自荐信
2013/11/09 职场文书
《真想变成大大的荷叶》教学反思
2014/04/14 职场文书
火箭队口号
2014/06/18 职场文书
写给纪委的违纪检讨书
2015/05/05 职场文书
六年级作文之自救
2019/12/19 职场文书
Go调用Rust方法及外部函数接口前置
2022/06/14 Golang
pd.drop_duplicates删除重复行的方法实现
2022/06/16 Python