微信小程序登录对接Django后端实现JWT方式验证登录详解


Posted in Javascript onJuly 29, 2019

先上效果图

微信小程序登录对接Django后端实现JWT方式验证登录详解

微信小程序登录对接Django后端实现JWT方式验证登录详解

点击授权按钮后可以显示部分资料和头像,点击修改资料可以修改部分资料。

流程

1.使用微信小程序登录和获取用户信息Api接口
2.把Api获取的用户资料和code发送给django后端
3.通过微信接口把code换取成openid
4.后端将openid作为用户名和密码
5.后端通过JSON web token方式登录,把token和用户id传回小程序
6.小程序将token和用户id保存在storage中
下次请求需要验证用户身份的页面时,在header中加入token这个字段

微信小程序代码

获取用户信息的方法这里不展示,可以在微信小程序文档中看到

登录方法

login: function(event) {
 wx.login({
  success: res => {
  console.log(res)
  //请求后端换取openid的接口
  http.request({
   url: '/get-openid/',
   method: 'POST',
   data: {
   //将code传到后端
   jscode: res.code
   },
   success: res => {
   //获取到openid作为账号密码
   console.log(res)
   console.log(app.globalData.userInfo)
   http.request({
    url: '/wx-login/',
    method: 'POST',
    data: {
    openid: res.openid,
    session_key: res.session_key,
    nickname: app.globalData.userInfo.nickName,
    avatar_url: app.globalData.userInfo.avatarUrl,
    gender: app.globalData.userInfo.gender
    },
    //登录成功后返回token保存在storage中
    success: res => {
    console.log(res)
    //token存入storage
    wx.setStorageSync('jwt_token', res.token)
    wx.setStorageSync('user_id', res.user_id)
    this.reFreshUserProfile()
    //登录状态置为true
    this.setData({
     isLogin: true,
     hasUserInfo: true
    })
    app.globalData.isLogin = true
    }
   })

   }
  })
  }
 })
 }

注销方法

logout: function(res) {
 this.setData({
  isLogin:false,
  hasUserInfo:false
 })
 app.globalData.isLogin = false
 wx.removeStorageSync('jwt_token')
 wx.removeStorageSync('user_id')
 },

Django后端的实现

首先安装djangorestframework-jwt

这里不使用他默认的登录接口,如下所示

微信小程序登录对接Django后端实现JWT方式验证登录详解

它提供了手动签发token和解密token的功能,因此最好自己实现

手动签发token

jwt_payload_handler = api_settings.JWT_PAYLOAD_HANDLER
 jwt_encode_handler = api_settings.JWT_ENCODE_HANDLER
 payload = jwt_payload_handler(user)
 token = jwt_encode_handler(payload)

手动解密token

jwt_decode_handler = api_settings.JWT_DECODE_HANDLER
 user_dict = jwt_decode_handler(token)
 user_id = user_dict['user_id']

后端换取openid

class OpenId:
 def __init__(self, jscode):
  self.url = 'https://api.weixin.qq.com/sns/jscode2session'
  self.app_id = env.str('APPID')
  self.app_secret = env.str('APPSECRET')
  self.jscode = jscode

 def get_openid(self):
  url = self.url + "?appid=" + self.app_id + "&secret=" + self.app_secret + "&js_code=" + self.jscode + "&grant_type=authorization_code"
  res = requests.get(url)
  try:
   openid = res.json()['openid']
   session_key = res.json()['session_key']
  except KeyError:
   return 'fail'
  else:
   return openid, session_key

后端返回openid接口实现

这里只使用简单的FBV视图

注:前端传来的值无法从request.POST中接收到,只能使用如下方法

@require_http_methods(['POST'])
@csrf_exempt
def GetOpenIdView(request):
 data = json.loads(request.body)
 jscode = data['jscode']

 openid, session_key = OpenId(jscode).get_openid()
 return JsonResponse({
  'openid': openid,
  'session_key': session_key
 })

后端登录接口实现

如果不存在用户则自动创建
为了简单,用户名和密码都是openid

@require_http_methods(['POST'])
@csrf_exempt
def login_or_create_account(request):
 data = json.loads(request.body)
 print(data)
 openid = data['openid']
 nickname = data['nickname']
 avatar_url = data['avatar_url']
 gender = data['gender']

 try:
  user = User.objects.get(username=openid)
 except User.DoesNotExist:
  user = None

 if user:
  user = User.objects.get(username=openid)
 else:
  user = User.objects.create(
   username=openid,
   password=openid,
   nickname=nickname,
   avatar_url=avatar_url,
   gender=gender
  )

 jwt_payload_handler = api_settings.JWT_PAYLOAD_HANDLER
 jwt_encode_handler = api_settings.JWT_ENCODE_HANDLER
 payload = jwt_payload_handler(user)
 token = jwt_encode_handler(payload)
 res = {
  'status': 'success',
  'nickname': user.nickname,
  'user_id': user.id,
  'token': token
 }
 return JsonResponse(res)

以上就是简单的微信小程序登录对接Django的思路,很多地方不严谨,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Javascript 相关文章推荐
不错的一个日期输入 动态
Nov 06 Javascript
extjs ColumnChart设置不同的颜色实现代码
May 17 Javascript
JavaScript 中的日期和时间及表示标准介绍
Aug 21 Javascript
原始XMLHttpRequest方法详情回顾
Nov 28 Javascript
基于jQuery实现淡入淡出效果轮播图
Jul 31 Javascript
对js中回调函数的一些看法
Aug 29 Javascript
jQuery实现简洁的轮播图效果实例
Sep 07 Javascript
浅谈jquery中next与siblings的区别
Oct 27 Javascript
ES6字符串模板,剩余参数,默认参数功能与用法示例
Apr 06 Javascript
小程序自定义单页面、全局导航栏的实现代码
Mar 15 Javascript
vue项目中全局引入1个.scss文件的问题解决
Aug 01 Javascript
Servlet返回的数据js解析2种方法
Dec 12 Javascript
JavaScript HTML DOM元素 节点操作汇总
Jul 29 #Javascript
vue.js 2.0实现简单分页效果
Jul 29 #Javascript
JavaScript如何获取一个元素的样式信息
Jul 29 #Javascript
教你搭建按需加载的Vue组件库(小结)
Jul 29 #Javascript
JavaScript 继承 封装 多态实现及原理详解
Jul 29 #Javascript
Vue2.0实现简单分页及跳转效果
Jul 29 #Javascript
JavaScript面向对象程序设计中对象的定义和继承详解
Jul 29 #Javascript
You might like
PHP防范SQL注入的具体方法详解(测试通过)
2014/05/09 PHP
js 实现打印网页中定义的部分内容的代码
2010/04/01 Javascript
这段js代码得节约你多少时间
2011/12/20 Javascript
javascript 基础篇1 什么是js 建立第一个js程序
2012/03/14 Javascript
javascript HTML+CSS实现经典橙色导航菜单
2016/02/16 Javascript
jQuery简单创建节点的方法
2016/09/09 Javascript
D3.js实现文本的换行详解
2016/10/14 Javascript
AngularJS指令与指令之间的交互功能示例
2016/12/14 Javascript
推荐三款日期选择插件(My97DatePicker、jquery.datepicker、Mobiscroll)
2017/04/21 jQuery
使用jQuery实现动态添加小广告
2017/07/11 jQuery
小白教程|一小时上手最流行的前端框架vue(推荐)
2019/04/10 Javascript
jQuery实现数字华容道小游戏(实例代码)
2020/01/16 jQuery
javascript设计模式 ? 组合模式原理与应用实例分析
2020/04/14 Javascript
Bootstrap FileInput实现图片上传功能
2021/01/28 Javascript
[01:00:17]DOTA2-DPC中国联赛 正赛 SAG vs Dynasty BO3 第二场 1月25日
2021/03/11 DOTA
python ElementTree 基本读操作示例
2009/04/09 Python
Python图片转换成矩阵,矩阵数据转换成图片的实例
2018/07/02 Python
Django2.1.3 中间件使用详解
2018/11/26 Python
在Python 中同一个类两个函数间变量的调用方法
2019/01/31 Python
python实现趣味图片字符化
2019/04/30 Python
Django 实现admin后台显示图片缩略图的例子
2019/07/28 Python
python创建与遍历List二维列表的方法
2019/08/16 Python
PyQT5 emit 和 connect的用法详解
2019/12/13 Python
Python StringIO如何在内存中读写str
2020/01/07 Python
Python基础进阶之海量表情包多线程爬虫功能的实现
2020/12/17 Python
原装进口全世界:天猫国际
2016/08/03 全球购物
印度低票价航空公司:GoAir
2017/10/11 全球购物
简单说说tomcat的配置
2013/05/28 面试题
不打扫卫生检讨书
2014/02/12 职场文书
小班幼儿评语大全
2014/04/30 职场文书
小学端午节活动总结
2015/02/11 职场文书
学校光盘行动倡议书
2015/04/28 职场文书
2016年大学生寒假社会实践心得体会
2015/10/09 职场文书
Python获取百度热搜的完整代码
2021/04/07 Python
Python 多线程处理任务实例
2021/11/07 Python
js作用域及作用域链工作引擎
2022/07/07 Javascript