微信小程序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读取网页内容的方法
Jul 30 Python
python轻松查到删除自己的微信好友
Jan 10 Python
Linux中安装Python的交互式解释器IPython的教程
Jun 13 Python
python 写入csv乱码问题解决方法
Oct 23 Python
python读取excel表格生成erlang数据
Aug 26 Python
Python GUI编程完整示例
Apr 04 Python
Django REST框架创建一个简单的Api实例讲解
Nov 05 Python
Python三元运算与lambda表达式实例解析
Nov 30 Python
Python基于yield遍历多个可迭代对象
Mar 12 Python
Django+RestFramework API接口及接口文档并返回json数据操作
Jul 12 Python
pycharm 的Structure界面设置操作
Feb 05 Python
通用的Django注册功能模块实现方法
Feb 05 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判断浏览器的类型和语言的函数代码
2013/02/28 PHP
PHP5中Cookie与 Session使用详解
2013/04/30 PHP
php5.2以下版本无json_decode函数的解决方法
2014/05/25 PHP
文件上传之SWFUpload插件(代码)
2015/07/30 PHP
javascript 时间比较实现代码
2009/10/28 Javascript
extjs 初始化checkboxgroup值的代码
2011/09/21 Javascript
jquery实现标题字体变换的滑动门菜单效果
2015/09/07 Javascript
jquery 表单验证之通过 class验证表单不为空
2015/11/02 Javascript
jquery实现一个简单的表单验证实例
2016/03/30 Javascript
Javascript实现汉字和拼音互转的终极方案
2016/10/19 Javascript
jQuery内容筛选选择器实例代码
2017/02/06 Javascript
基于Vue2实现的仿手机QQ单页面应用功能(接入聊天机器人 )
2017/03/30 Javascript
JS+canvas画一个圆锥实例代码
2017/12/13 Javascript
vue select选择框数据变化监听方法
2018/08/24 Javascript
关于Vue项目跨平台运行问题的解决方法
2018/09/18 Javascript
JS判断用户用的哪个浏览器实例详解
2018/10/09 Javascript
React事件处理的机制及原理
2018/12/03 Javascript
Vue核心概念Action的总结
2019/01/18 Javascript
vue自定义指令实现方法详解
2019/02/11 Javascript
[01:30:55]VG vs Mineski Supermajor 败者组 BO3 第三场 6.6
2018/06/07 DOTA
在Python的web框架中中编写日志列表的教程
2015/04/30 Python
Python如何实现强制数据类型转换
2019/11/22 Python
python 遍历pd.Series的index和value
2019/11/26 Python
python装饰器原理与用法深入详解
2019/12/19 Python
Python实现分数序列求和
2020/02/25 Python
django form和field具体方法和属性说明
2020/07/09 Python
华为旗下电子商务平台:华为商城
2016/08/06 全球购物
写clone()方法时,通常都有一行代码,是什么?
2012/10/31 面试题
大专毕业生简历的自我评价
2013/10/20 职场文书
职工运动会邀请函
2014/02/02 职场文书
2015年社区关工委工作总结
2015/04/03 职场文书
评奖评优个人先进事迹材料
2015/11/04 职场文书
导游词之宿迁乾隆行宫
2019/10/15 职场文书
postman中form-data、x-www-form-urlencoded、raw、binary的区别介绍
2022/01/18 HTML / CSS
PyTorch device与cuda.device用法
2022/04/03 Python
使用 CSS 构建强大且酷炫的粒子动画效果
2022/08/14 HTML / CSS