微信小程序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 enumerate遍历数组示例应用
Sep 06 Python
Python动态加载模块的3种方法
Nov 22 Python
Python算术运算符实例详解
May 31 Python
python+pandas分析nginx日志的实例
Apr 28 Python
python re模块的高级用法详解
Jun 06 Python
详解pandas中MultiIndex和对象实际索引不一致问题
Jul 23 Python
python 利用jinja2模板生成html代码实例
Oct 10 Python
python编写微信公众号首图思路详解
Dec 13 Python
python关于变量名的基础知识点
Mar 03 Python
Django 项目布局方法(值得推荐)
Mar 22 Python
使用Python3 poplib模块删除服务器多天前的邮件实现代码
Apr 24 Python
Python实现在线批量美颜功能过程解析
Jun 10 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
全国FM电台频率大全 - 31 新疆维吾尔族自治区
2020/03/11 无线电
一个简单php扩展介绍与开发教程
2010/08/19 PHP
sql注入与转义的php函数代码
2013/06/17 PHP
重新认识php array_merge函数
2014/08/31 PHP
PHP单文件上传原理及上传函数的封装操作示例
2019/09/02 PHP
jQuery 1.0.4 - New Wave Javascript(js源文件)
2007/01/15 Javascript
from 表单提交返回值用post或者是get方法实现
2013/08/21 Javascript
在页面上用action传递参数到后台出现乱码的解决方法
2013/12/31 Javascript
使用focus方法让光标默认停留在INPUT框
2014/07/29 Javascript
利用原生JavaScript获取元素样式只是获取而已
2014/10/08 Javascript
Javascript中arguments用法实例分析
2015/06/13 Javascript
jquery悬浮提示框完整实例
2016/01/13 Javascript
基于chosen插件实现人员选择树搜索自动筛选功能
2016/09/24 Javascript
基于ajax和jsonp的原生封装(实例)
2017/10/16 Javascript
Vue中的混入的使用(vue mixins)
2018/06/01 Javascript
简单了解JavaScript sort方法
2019/11/25 Javascript
封装Vue Element的table表格组件的示例详解
2020/08/19 Javascript
JS访问对象两种方式区别解析
2020/08/29 Javascript
vue实现禁止浏览器记住密码功能的示例代码
2021/02/03 Vue.js
Python中动态获取对象的属性和方法的教程
2015/04/09 Python
Python采用Django制作简易的知乎日报API
2016/08/03 Python
Python操作csv文件实例详解
2017/07/31 Python
Python中矩阵库Numpy基本操作详解
2017/11/21 Python
python绘制中国大陆人口热力图
2018/11/07 Python
Python使用folium excel绘制point
2019/01/03 Python
Python中的self用法详解
2019/08/06 Python
使用Jupyter notebooks上传文件夹或大量数据到服务器
2020/04/14 Python
python读取excel数据并且画图的实现示例
2021/02/08 Python
美国最好的保健品打折网店:Swanson
2017/08/04 全球购物
英国手机壳购买网站:Case Hut
2019/04/11 全球购物
给校长的建议书
2014/03/12 职场文书
廉洁校园实施方案
2014/05/25 职场文书
2014年党课学习心得体会
2014/07/08 职场文书
铁人纪念馆观后感
2015/06/16 职场文书
2016年寒假社会实践活动心得体会
2015/10/09 职场文书
SQL实战演练之网上商城数据库商品类别数据操作
2021/10/24 MySQL