django与小程序实现登录验证功能的示例代码


Posted in Python onFebruary 19, 2019

之前用小程序做项目,因为后台使用的java开发,一切顺利,但切换成django做RESTful API接口时,在登陆注册时一直出现问题,网上搜索,借助一个网友的回答,找到了一种可行的解决方案,现记录如下。

具体流程

  • 用户点击小程序页面上的登录授权认证
  • 通过微信自带的认证获取code
  • 调取登录接口,将code传入后台
  • 后台拿到code调用微信接口获取openid等用户信息
  • 后台将openid作为用户名,若存在则去校验用户信息,否则以此用户名创建新用户,密码随机生成
  • 将校验结果或者创建信息返回给微信小程序端
  • 根据返回的信息完成用户登录校验

django的用户权限认证

django有一套自己的完善用户模型,由于Django Auth自带的User模型字段有限,我们需要对其进行拓展(直接使用也可以)

nickname = models.CharField(verbose_name=u'昵称',max_length=50, blank=True)
user_avatar = models.ImageField(verbose_name=u'用户头像', upload_to='image/%Y/%m/%d', default=u'image/default.png', max_length=500)
user_email = models.EmailField(verbose_name=u'用户邮箱',max_length=254)
user_phone = models.BigIntegerField(verbose_name=u'手机号', null=True,blank=True)
user_birthday = models.DateField(verbose_name=u'出生日期', default = timezone.now)
user_sex = models.CharField(verbose_name=u'性别',max_length=6,choices=(('male','男'),('female','女')),default='male')
user_address = models.CharField(verbose_name=u'地址',max_length=550, blank=True,null=True)
signature = models.CharField(verbose_name=u'个性签名',max_length=550, blank=True,null=True)

用户接口序列化

from rest_framework import serializers

class UserSerializer(serializers.ModelSerializer):
class Meta:
  model = User
  fields = "__all__"

登陆接口设计

class UserLogin(APIView):
  def post(self,request):
    params = request.data
    userName = get_openid(params.get('code'))
    userInfo = params.get('userinfo')
    try:
      user = User.objects.get(username = userName)
    except Exception as e:
      user = None
    if user:
      # 更新用户信息
      user = User.objects.get(username = userName)
    else:
      #注册新用户
      user = User.objects.create_user(username=userName,password=random_str(10))  
    #手动生成JWT
    # 手动生成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)

    ret = {'code': '00000', 'msg': None,'data':{}}
    
    ret['msg'] = '授权成功'
    ret['data'] = {
      'token': token,
      'user_id': user.id,
      'nickname': user.nickname
    }
    return JsonResponse(ret)

解析code获取openid

class OpenidUtils(object):
  def __init__(self, jscode):
    self.url = "https://api.weixin.qq.com/sns/jscode2session"
    self.appid = APPID
    self.secret = SECRET
    self.jscode = jscode  # 前端传回的动态jscode

  def get_openid(self):
    url = self.url + "?appid=" + self.appid + "&secret=" + self.secret + "&js_code=" + self.jscode + "&grant_type=authorization_code"
    r = requests.get(url)
    openid = r.json()['openid']
    return openid

小程序的登陆验证

具体登录流程可以查阅官方文档。

function getWXUserInfo() {
  const login = promisify(wx.login);
  const getUserInfo = promisify(wx.getUserInfo);

  return new Promise(function (resolve, reject) {
    _wxLogin();
    function _wxLogin() {
      login().then(function (res) {
        getUserInfo().then(function (r) {
          let userInfo = r;
          userInfo.code = res.code;
          try {
            wx.setStorageSync('userInfo', userInfo);
          } catch (e) {
            console.log(e)
          }
          if (userInfo && userInfo.code && userInfo.iv) {
            resolve(userInfo);
          }
          else {
            reject('wx login fail');
          }
        }).catch(function (error) {
          reject(error);
        });
      }).catch(function (error) {
        reject(error);
      });
    }
  });
}

//登录接口验证
getWXUserInfo().then(function (data) {
  var result = {
    code: 0,
    data: {}
  };
  var params = {
    'code':data.code,
    'userinfo':data.userInfo
  }
  wx.request({
    url: '/api/login',
    data: params,
    dataType: 'json',
    method: 'POST',
    success: function (response) {
      // 返回成功
      if (response.data && response.data.code == '00000') {
        try {
          var resData = {
            custNo: data.user_id,
            nickname: data.nickname
          };
          result.code = 0;
          result.data = resData;
          resolve(result);
        }
        catch (e) {
          console.warn(result)
          // 登录失败
          result.code = 2;
          resolve(result);
        }
      }
      else {
        // 获取 customNum 失败
        console.warn(result)
        result.code = 1;
        result.data = 'get customNum fail';
        resolve(result);
      }
    }
  })
}

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Python 相关文章推荐
Python的Flask框架中实现分页功能的教程
Apr 20 Python
Python实现excel转sqlite的方法
Jul 17 Python
python对DICOM图像的读取方法详解
Jul 17 Python
Python基于Tkinter模块实现的弹球小游戏
Dec 27 Python
Python 函数list&read&seek详解
Aug 28 Python
Django继承自带user表并重写的例子
Nov 18 Python
使用Django xadmin 实现修改时间选择器为不可输入状态
Mar 30 Python
如何使用python自带IDLE的几种方法
Oct 10 Python
Python实现手势识别
Oct 21 Python
OpenCV灰度化之后图片为绿色的解决
Dec 01 Python
Python中lru_cache的使用和实现详解
Jan 25 Python
Pandas搭配lambda组合使用详解
Jan 22 Python
实例讲解Python3中abs()函数
Feb 19 #Python
python协程之动态添加任务的方法
Feb 19 #Python
Python同步遍历多个列表的示例
Feb 19 #Python
python读取txt文件并取其某一列数据的示例
Feb 19 #Python
详解Python3注释知识点
Feb 19 #Python
Python3解释器知识点总结
Feb 19 #Python
python 利用文件锁单例执行脚本的方法
Feb 19 #Python
You might like
在PHP中使用模板的方法
2008/05/24 PHP
PHP strip_tags()去除HTML、XML以及PHP的标签介绍
2014/02/18 PHP
PHP的邮件群发系统phplist配置方法详细总结
2016/03/30 PHP
EasyUI 中 MenuButton 的使用方法
2012/07/14 Javascript
js控制表单奇偶行样式的简单方法
2013/07/31 Javascript
javascript强制点击广告的方法
2015/02/06 Javascript
jquery实现具有嵌套功能的选项卡
2016/02/12 Javascript
JS验证码实现代码
2017/09/14 Javascript
React学习笔记之高阶组件应用
2018/06/02 Javascript
9102年webpack4搭建vue项目的方法步骤
2019/02/20 Javascript
layui table动态表头 改变表格头部 重新加载表格的方法
2019/09/21 Javascript
jQuery 移除事件的方法
2020/06/20 jQuery
详解webpack的文件监听实现(热更新)
2020/09/11 Javascript
关于uniApp editor微信滑动问题
2021/01/15 Javascript
[01:31:22]DOTA2-DPC中国联赛定级赛 LBZS vs Magma BO3第二场 1月10日
2021/03/11 DOTA
python发布模块的步骤分享
2014/02/21 Python
Python中optparse模块使用浅析
2015/01/01 Python
Python实现统计英文单词个数及字符串分割代码
2015/05/28 Python
python实现自动登录人人网并采集信息的方法
2015/06/28 Python
Python下载网络文本数据到本地内存的四种实现方法示例
2018/02/05 Python
Python pycharm 同时加载多个项目的方法
2019/01/17 Python
把django中admin后台界面的英文修改为中文显示的方法
2019/07/26 Python
CSS3 真的会替代 SCSS 吗
2021/03/09 HTML / CSS
查找廉价航班和发现新目的地:Kiwi.com
2019/02/25 全球购物
进修护士自我鉴定
2013/10/14 职场文书
大学军训感言800字
2014/02/27 职场文书
《小池塘》教学反思
2014/02/28 职场文书
党的群众路线教育实践活动公开承诺书
2014/03/28 职场文书
小学向国旗敬礼活动方案
2014/09/27 职场文书
信访维稳工作汇报
2014/10/27 职场文书
2015元旦主持词开场白和结束语
2014/12/14 职场文书
南湾猴岛导游词
2015/02/09 职场文书
交通安全主题班会
2015/08/12 职场文书
Java中常用解析工具jackson及fastjson的使用
2021/06/28 Java/Android
Java版 简易五子棋小游戏
2022/05/04 Java/Android
使用compose函数优化代码提高可读性及扩展性
2022/06/16 Javascript