微信小程序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 29 Python
关于Python中异常(Exception)的汇总
Jan 18 Python
Python3.5面向对象编程图文与实例详解
Apr 24 Python
详解Python中的正斜杠与反斜杠
Aug 09 Python
深入浅析Python科学计算库Scipy及安装步骤
Oct 12 Python
基于torch.where和布尔索引的速度比较
Jan 02 Python
Tensorflow 自定义loss的情况下初始化部分变量方式
Jan 06 Python
Tensorflow训练模型越来越慢的2种解决方案
Feb 07 Python
浅谈python输出列表元素的所有排列形式
Feb 26 Python
python filecmp.dircmp实现递归比对两个目录的方法
May 22 Python
在 Windows 下搭建高效的 django 开发环境的详细教程
Jul 27 Python
Python常用断言函数实例汇总
Nov 30 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中mysql_field_type()函数用法
2014/11/24 PHP
PHP中is_dir()函数使用指南
2015/05/08 PHP
yii2中添加验证码的实现方法
2016/01/09 PHP
Zend Framework教程之Bootstrap类用法概述
2016/03/14 PHP
php实现留言板功能
2017/03/05 PHP
php设计模式之模板模式实例分析【星际争霸游戏案例】
2020/03/24 PHP
PHP代码覆盖率统计详解
2020/07/22 PHP
编写兼容IE和FireFox的脚本
2009/05/18 Javascript
来自国外的页面JavaScript文件优化
2010/12/08 Javascript
js 判断js函数、变量是否存在的简单示例代码
2014/03/04 Javascript
JavaScript中变量声明有var和没var的区别示例介绍
2014/09/15 Javascript
在AngularJS中使用AJAX的方法
2015/06/17 Javascript
JS+CSS实现的蓝色table选项卡效果
2015/10/08 Javascript
jQuery表单验证简单示例
2016/10/17 Javascript
js移动焦点到最后位置的简单方法
2016/11/25 Javascript
knockoutjs模板实现树形结构列表
2017/07/31 Javascript
详解react-router4 异步加载路由两种方法
2017/09/12 Javascript
jquery实现左右轮播图效果
2017/09/28 jQuery
JS中getElementsByClassName与classList兼容性问题解决方案分析
2019/08/07 Javascript
vue-form表单验证是否为空值的实例详解
2019/10/29 Javascript
JavaScript实现雪花飘落效果
2020/12/27 Javascript
python通过字典dict判断指定键值是否存在的方法
2015/03/21 Python
简单讲解Python中的数字类型及基本的数学计算
2016/03/11 Python
Python中工作日类库Busines Holiday的介绍与使用
2017/07/06 Python
Python数据结构之单链表详解
2017/09/12 Python
python 获取图片分辨率的方法
2019/01/08 Python
Pycharm中安装wordcloud等库失败问题及终端通过pip安装的Python库如何添加到Pycharm解释器中(推荐)
2020/05/10 Python
python简单实现9宫格图片实例
2020/09/03 Python
CSS3 优势以及网页设计师如何使用CSS3技术
2009/07/29 HTML / CSS
CSS超出文本指定宽度用省略号代替和文本不换行
2016/05/05 HTML / CSS
2014年创卫实施方案
2014/02/18 职场文书
商务英语广告词大全
2014/03/18 职场文书
英文推荐信格式范文
2014/05/09 职场文书
文化建设工作方案
2014/05/12 职场文书
春游踏青活动方案
2014/08/14 职场文书
Python一行代码实现自动发邮件功能
2021/05/30 Python