微信小程序登录对接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 相关文章推荐
基于JQuery.timer插件实现一个计时器
Apr 25 Javascript
基于jQuery制作迷你背词汇工具
Jul 27 Javascript
浅谈JavaScript中的Math.atan()方法的使用
Jun 14 Javascript
微信小程序 使用canvas制作K线实例详解
Jan 12 Javascript
javascript 正则表达式去空行方法
Jan 24 Javascript
javascript常用的设计模式
Feb 09 Javascript
微信小程序loading组件显示载入动画用法示例【附源码下载】
Dec 09 Javascript
Node层模拟实现multipart表单的文件上传示例
Jan 02 Javascript
Node.js 实现远程桌面监控的方法步骤
Jul 02 Javascript
小程序中canvas的drawImage方法参数使用详解
Jul 04 Javascript
基于js实现抽红包并分配代码实例
Sep 19 Javascript
vue 实现用户登录方式的切换功能
Apr 14 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 实现进制转换(二进制、八进制、十六进制)互相转换实现代码
2010/10/22 PHP
PHP表单验证的3个函数ISSET()、empty()、is_numeric()的使用方法
2011/08/22 PHP
Linux中为php配置伪静态
2014/12/17 PHP
yii2整合百度编辑器umeditor及umeditor图片上传问题的解决办法
2016/04/20 PHP
php安装dblib扩展,连接mssql的具体步骤
2017/03/02 PHP
js展开闭合效果演示代码
2013/07/24 Javascript
JQuery写动态树示例代码
2013/07/31 Javascript
读取input:file的路径并显示本地图片的方法
2013/09/23 Javascript
jQuery的live()方法对hover事件的处理示例
2014/02/27 Javascript
Javascript基础教程之break和continue语句
2015/01/18 Javascript
jquery中添加属性和删除属性
2015/06/03 Javascript
IE浏览器下PNG相关功能
2015/07/05 Javascript
jq实现左侧显示图片右侧文字滑动切换效果
2015/08/04 Javascript
Jquery和JS获取ul中li标签的实现方法
2016/06/02 Javascript
关于两个jQuery(js)特效冲突的bug的解决办法
2016/09/04 Javascript
详解JavaScript RegExp对象
2017/02/04 Javascript
JavaScript运动框架 解决速度正负取整问题(一)
2017/05/17 Javascript
JS实现新建文件夹功能
2017/06/17 Javascript
Vue上传组件vue Simple Uploader的用法示例
2017/08/25 Javascript
angularjs实现的购物金额计算工具示例
2018/05/08 Javascript
小程序scroll-view组件实现滚动的示例代码
2018/09/20 Javascript
vue如何解决循环引用组件报错的问题
2018/09/22 Javascript
Python中的闭包详细介绍和实例
2014/11/21 Python
Python抓取手机号归属地信息示例代码
2016/11/28 Python
django开发教程之利用缓存文件进行页面缓存的方法
2017/11/10 Python
基于python list对象中嵌套元组使用sort时的排序方法
2018/04/18 Python
使用python实现画AR模型时序图
2019/11/20 Python
Python 爬虫批量爬取网页图片保存到本地的实现代码
2020/12/24 Python
一套Delphi的笔试题二
2013/05/11 面试题
共产党员承诺书
2014/03/25 职场文书
幼儿园大班评语大全
2014/04/17 职场文书
2014报到证办理个人委托书
2014/10/08 职场文书
小学少先队辅导员述职报告
2015/01/10 职场文书
2015年禁毒宣传活动总结
2015/03/25 职场文书
学校节水倡议书
2015/04/29 职场文书
Redis实现短信验证码登录的示例代码
2022/06/14 Redis