微信小程序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 25 Python
Python实现生成随机日期字符串的方法示例
Dec 25 Python
Python搭建FTP服务器的方法示例
Jan 19 Python
python Pandas 读取txt表格的实例
Apr 29 Python
使用Python的Dataframe取两列时间值相差一年的所有行方法
Jul 10 Python
python画图——实现在图上标注上具体数值的方法
Jul 08 Python
详解Python Matplotlib解决绘图X轴值不按数组排序问题
Aug 05 Python
详解python路径拼接os.path.join()函数的用法
Oct 09 Python
python定时任务 sched模块用法实例
Nov 04 Python
Cython编译python为so 代码加密示例
Dec 23 Python
python实现批量修改文件名
Mar 23 Python
Python scrapy爬取小说代码案例详解
Jul 09 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
destoon二次开发常用数据库操作
2014/06/21 PHP
php按单词截取字符串的方法
2015/04/07 PHP
PHP实现微信图片上传到服务器的方法示例
2017/06/29 PHP
PHP实现通过CURL上传文件功能示例
2018/05/30 PHP
获取URL地址中的文件名和参数的javascript代码
2009/09/02 Javascript
高性能web开发 如何加载JS,JS应该放在什么位置?
2010/05/14 Javascript
javascript语言结构小记(一)
2011/09/10 Javascript
通过Javascript创建一个选择文件的对话框代码
2012/06/16 Javascript
在javascript中实现函数数组的方法
2013/12/25 Javascript
jQuery遍历节点树方法分析
2016/09/08 Javascript
利用VUE框架,实现列表分页功能示例代码
2017/01/12 Javascript
基于LayUI实现前端分页功能的方法
2017/07/22 Javascript
vue使用 better-scroll的参数和方法详解
2018/01/25 Javascript
vue项目国际化vue-i18n的安装使用教程
2018/03/14 Javascript
vue-router 中 meta的用法详解
2019/11/01 Javascript
浅谈Vue3.0新版API之composition-api入坑指南
2020/04/30 Javascript
解决vue项目运行提示Warnings while compiling.警告的问题
2020/09/18 Javascript
python根据路径导入模块的方法
2014/09/30 Python
详解Python中的条件判断语句
2015/05/14 Python
Python决策树和随机森林算法实例详解
2018/01/30 Python
Python实现统计给定字符串中重复模式最高子串功能示例
2018/05/16 Python
python实现狄克斯特拉算法
2019/01/17 Python
python 处理数字,把大于上限的数字置零实现方法
2019/01/28 Python
python 数据提取及拆分的实现代码
2019/08/26 Python
python几种常用功能实现代码实例
2019/12/25 Python
Python读取文件内容为字符串的方法(多种方法详解)
2020/03/04 Python
django下创建多个app并设置urls方法
2020/08/02 Python
世界上第一个水枕头:Mediflow
2018/12/06 全球购物
Java中有几种方法可以实现一个线程?用什么关键字修饰同步方法?stop()和suspend()方法为何不推荐使用?
2015/08/04 面试题
客服端调用EJB对象的几个基本步骤
2012/01/15 面试题
岗位职责的含义
2013/11/17 职场文书
社区活动总结报告
2014/05/05 职场文书
护理专业毕业生自荐书
2014/05/24 职场文书
政风行风评议个人心得体会
2014/10/29 职场文书
破坏寝室公物检讨书
2014/11/17 职场文书
大一学生个人总结
2015/02/15 职场文书