微信小程序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解惑之True和False详解
Apr 24 Python
django 2.0更新的10条注意事项总结
Jan 05 Python
Python3.6通过自带的urllib通过get或post方法请求url的实例
May 10 Python
python opencv3实现人脸识别(windows)
May 25 Python
Python 操作 ElasticSearch的完整代码
Aug 04 Python
python应用文件读取与登录注册功能
Sep 23 Python
python3 logging日志封装实例
Apr 08 Python
Pandas中DataFrame基本函数整理(小结)
Jul 20 Python
如何在windows下安装配置python工具Ulipad
Oct 27 Python
聊聊Python pandas 中loc函数的使用,及跟iloc的区别说明
Mar 03 Python
python 定义函数 返回值只取其中一个的实现
May 21 Python
如何使用PyCharm及常用配置详解
Jun 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中filter_input函数用法分析
2014/11/15 PHP
php实现只保留mysql中最新1000条记录
2015/06/18 PHP
PHP编写简单的App接口
2016/08/28 PHP
PHP实现合并两个排序链表的方法
2018/01/19 PHP
php strftime函数的详细用法
2018/06/21 PHP
Laravel创建数据库表结构的例子
2019/10/09 PHP
PHP实现微信提现功能(微信商城)
2019/11/21 PHP
用javascript做拖动布局的思路
2008/05/31 Javascript
jquery attr 设定src中含有&amp;(宏)符号问题的解决方法
2011/07/26 Javascript
js调用后台servlet方法实例
2013/06/09 Javascript
JS实现金额转换(将输入的阿拉伯数字)转换成中文的实现代码
2013/09/30 Javascript
如何实现textarea里的不同文本显示不同颜色
2014/01/20 Javascript
javascript自定义函数参数传递为字符串格式
2014/07/29 Javascript
jquery中val()方法是从最后一个选项往前读取的
2015/09/06 Javascript
javascript学习笔记_浅谈基础语法,类型,变量
2016/09/19 Javascript
基于javascript实现最简单选项卡切换
2017/02/01 Javascript
微信小程序之MaterialDesign--input组件详解
2017/02/15 Javascript
详解jQuery中关于Ajax的几个常用的函数
2017/07/17 jQuery
Vue中的v-for指令不起效果的解决方法
2018/09/27 Javascript
详解如何使用webpack打包多页jquery项目
2019/02/01 jQuery
js单线程的本质 Event Loop解析
2019/10/29 Javascript
jQuery 函数实例分析【函数声明、函数表达式、匿名函数等】
2020/05/19 jQuery
vue+vant 上传图片需要注意的地方
2021/01/03 Vue.js
Python 3.x 新特性及10大变化
2015/06/12 Python
python DataFrame获取行数、列数、索引及第几行第几列的值方法
2018/04/08 Python
django利用request id便于定位及给日志加上request_id
2018/08/26 Python
python数据归一化及三种方法详解
2019/08/06 Python
Pyqt5自适应布局实例
2019/12/13 Python
python:HDF和CSV存储优劣对比分析
2020/06/08 Python
你需要学会的8个Python列表技巧
2020/06/24 Python
工商治理实习生的自我评价
2014/01/15 职场文书
政治表现评语
2014/05/04 职场文书
学校联谊协议书
2014/09/16 职场文书
二审答辩状格式
2015/05/22 职场文书
pd.drop_duplicates删除重复行的方法实现
2022/06/16 Python
分享很少见很有用的SQL功能CORRESPONDING
2022/08/05 MySQL