微信小程序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 相关文章推荐
在Django中使用Sitemap的方法讲解
Jul 22 Python
python的dataframe和matrix的互换方法
Apr 11 Python
Python基于递归和非递归算法求两个数最大公约数、最小公倍数示例
May 21 Python
python特性语法之遍历、公共方法、引用
Aug 08 Python
python读取有密码的zip压缩文件实例
Feb 08 Python
python脚本当作Linux中的服务启动实现方法
Jun 28 Python
python中树与树的表示知识点总结
Sep 14 Python
Python实现一个简单的毕业生信息管理系统的示例代码
Jun 08 Python
浅谈TensorFlow之稀疏张量表示
Jun 30 Python
六种酷炫Python运行进度条效果的实现代码
Jul 17 Python
Python如何把字典写入到CSV文件的方法示例
Aug 23 Python
Python 实现PS滤镜的旋涡特效
Dec 03 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/12/05 PHP
PHP中for循环语句的几种变型
2007/03/16 PHP
使用php实现快钱支付功能(涉及到接口)
2013/07/01 PHP
对PHP新手的一些建议(PHP学习经验总结)
2014/08/20 PHP
php阿拉伯数字转中文人民币大写
2015/12/21 PHP
Laravel 5.5基于内置的Auth模块实现前后台登陆详解
2017/12/21 PHP
laravel框架模板之公共模板、继承、包含实现方法分析
2019/08/30 PHP
JS 继承实例分析
2008/11/04 Javascript
jquery下异步提交表单 异步跨域提交表单
2010/11/17 Javascript
jQuery 一个图片切换的插件
2011/10/09 Javascript
jQuery中使用each处理json数据
2015/04/23 Javascript
Javascript点击其他任意地方隐藏关闭DIV实例
2016/06/21 Javascript
window.close(); 关闭浏览器窗口js代码的总结介绍
2016/07/14 Javascript
关于Vue Webpack2单元测试示例详解
2017/08/14 Javascript
微信小程序 input表单与redio及下拉列表的使用实例
2017/09/20 Javascript
使用Bootrap和Vue实现仿百度搜索功能
2017/10/26 Javascript
通过nodejs 服务器读取HTML文件渲染到页面的方法
2018/05/17 NodeJs
Angular事件之不同组件间传递数据的方法
2018/11/15 Javascript
详解puppeteer使用代理
2018/12/27 Javascript
微信小程序wxml列表渲染原理解析
2019/11/27 Javascript
JS快速实现简单计算器
2020/04/08 Javascript
[16:27]DOTA2 HEROS教学视频教你分分钟做大人-艾欧
2014/06/11 DOTA
python列表去重的二种方法
2014/02/14 Python
将Python代码打包为jar软件的简单方法
2015/08/04 Python
python去除空格和换行符的实现方法(推荐)
2017/01/04 Python
详解python实现线程安全的单例模式
2018/03/05 Python
如何使用Python实现自动化水军评论
2019/06/26 Python
keras 自定义loss model.add_loss的使用详解
2020/06/22 Python
Helly Hansen工作服美国官方网上商店:为最恶劣的环境
2019/09/04 全球购物
外贸公司实习自我鉴定
2013/09/24 职场文书
生物科学专业个人求职信范文
2013/12/05 职场文书
干部作风整顿自我剖析材料和整改措施
2014/09/18 职场文书
“四风”查摆问题自我剖析材料
2014/09/27 职场文书
员工年终考核评语
2014/12/31 职场文书
vue-cli4.5.x快速搭建项目
2021/05/30 Vue.js
Python语言规范之Pylint的详细用法
2021/06/24 Python