微信小程序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抓取网页图片并放到指定文件夹
Apr 24 Python
分享Python字符串关键点
Dec 13 Python
Python轻量级ORM框架Peewee访问sqlite数据库的方法详解
Jul 20 Python
OpenCV-Python实现轮廓检测实例分析
Jan 05 Python
浅谈Python中的zip()与*zip()函数详解
Feb 24 Python
对Python2与Python3中__bool__方法的差异详解
Nov 01 Python
python django框架中使用FastDFS分布式文件系统的安装方法
Jun 10 Python
linux环境中没有网络怎么下载python
Jul 07 Python
Python中的四种交换数值的方法解析
Nov 18 Python
Python3标准库glob文件名模式匹配的问题
Mar 13 Python
python实现贪吃蛇双人大战
Apr 18 Python
OpenCV实现机器人对物体进行移动跟随的方法实例
Nov 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
PHP动态变静态原理
2006/11/25 PHP
将FCKeditor导入PHP+SMARTY的实现方法
2015/01/15 PHP
PHP 实现代码复用的一个方法 traits新特性
2015/02/22 PHP
php轻松实现文件上传功能
2016/03/03 PHP
PHP接收App端发送文件流的方法
2016/09/23 PHP
php实现支持中文的文件下载功能示例
2017/08/30 PHP
PHP实现用户登录的案例代码
2018/05/10 PHP
使用PHPExcel导出Excel表
2018/09/08 PHP
laravel添加前台跳转成功页面示例
2019/10/22 PHP
php正则表达式使用方法整理集合
2020/01/31 PHP
限制文本框输入N个字符的js代码
2010/05/13 Javascript
js处理php输出时间戳对不上号的解决方法
2014/06/20 Javascript
JavaScript模拟实现键盘打字效果
2015/06/29 Javascript
JavaScript操作select元素和option的实例代码
2016/01/29 Javascript
jQuery原理系列-css选择器的简单实现
2016/06/07 Javascript
js将table的每个td的内容自动赋值给其title属性的方法
2016/10/13 Javascript
jQuery日程管理插件fullcalendar使用详解
2017/01/07 Javascript
AngularJS报错$apply already in progress的解决方法分析
2017/01/30 Javascript
JavaScript箭头函数_动力节点Java学院整理
2017/06/28 Javascript
浅谈Vue响应式(数组变异方法)
2018/05/07 Javascript
解析vue路由异步组件和懒加载案例
2018/06/08 Javascript
详解从NodeJS搭建中间层再谈前后端分离
2018/11/13 NodeJs
vue 组件简介
2020/07/31 Javascript
html中创建并调用vue组件的几种方法汇总
2020/11/17 Javascript
[49:02]KG vs Infamous 2019国际邀请赛淘汰赛 败者组BO1 8.20.mp4
2020/07/19 DOTA
通过源码分析Python中的切片赋值
2017/05/08 Python
Python基于Tkinter模块实现的弹球小游戏
2018/12/27 Python
aden + anais官方网站:婴儿襁褓、毯子、尿布和服装
2017/06/21 全球购物
英国在线汽车和面包车零件商店:Car Parts 4 Less
2018/08/15 全球购物
戴森比利时官方网站:Dyson BE
2020/10/03 全球购物
应届电子商务毕业自荐书范文
2014/02/11 职场文书
技校毕业生个人学习的自我评价
2014/02/21 职场文书
自荐信的基本格式
2014/02/22 职场文书
高一学生期末评语
2014/04/25 职场文书
安全检查汇报材料
2014/12/26 职场文书
Django利用AJAX技术实现博文实时搜索
2021/05/06 Python