django-微信小程序登录

小程序登录逻辑
前端通过调用wx.login()获取code, 将code和用户基本信息发送到后端,后端通过request.get向微信服务器发送get请求获取用户openid和session_key,手动添加jwt-token,利用jwt自动校验用户是否登录

小程序前端触发login事件

<button class="confirm-btn"  open-type="getUserInfo" bindgetuserinfo="login" wx:if="{{regFlag==false}}">授权登录</button>

js代码:login事件接收的参数 e.detail.userInfo保存了用户基本信息,调用wxlogin方法获取用户的code,发送到后端

login:function( e ){
        var that = this;
        if( !e.detail.userInfo ){
            app.alert( { ‘content‘:‘登录失败,请再次点击~~‘ } );
            return;
        }

        var data = e.detail.userInfo;
        wx.login({
            success:function( res ){
                if( !res.code ){
                    app.alert( { ‘content‘:‘登录失败,请再次点击~~‘ } );
                    return;
                }
                data[‘code‘] = res.code;
                wx.request({
                    url:app.buildUrl( ‘/member/login‘ ),
                    header:app.getRequestHeader(),
                    method:‘POST‘,
                    data:data,
                    success:function( res ){
                        if( res.data.code != 200 ){
                            app.alert( { ‘content‘:res.data.msg } );
                            return;
                        }
                        app.setCache( "token",res.data.data.token );
                        that.goToIndex();
                    }
                });
            }
        });
    }

后端代码:

用户模型类继承自django自带的用户模型,新增三个用户信息字段

class User(AbstractUser):
    USER_GENDER_CHOICES = (
        (0, ‘女‘),
        (1, ‘男‘),
    )
    sex = models.SmallIntegerField(choices=USER_GENDER_CHOICES, default=1, verbose_name="性别")
    avatar = models.CharField(max_length=50, default="", null=True, blank=True, verbose_name="头像")
    openid = models.CharField(max_length=64, db_index=True, verbose_name=‘openid‘)

    class Meta:
        db_table = ‘tb_users‘
        verbose_name = ‘用户‘
        verbose_name_plural = verbose_name

类视图:发送请求获取用户的openid,用openid来查询是否用户已经存在,不存在创建信的用户,统一手动签发jwt_token返回

class WechatLoginView(APIView):
    """
    微信登录逻辑
    """

    def post(self, request):
        # 前端发送code到后端,后端发送网络请求到微信服务器换取openid
        code = request.data.get(‘code‘)
        if not code:
            return Response({‘message‘: ‘缺少code‘}, status=status.HTTP_400_BAD_REQUEST)

        url = "https://api.weixin.qq.com/sns/jscode2session?appid={0}&secret={1}&js_code={2}&grant_type=authorization_code"             .format(settings.APP_ID, settings.APP_KEY, code)
        r = requests.get(url)
        res = json.loads(r.text)
        openid = res[‘openid‘] if ‘openid‘ in res else None
        # session_key = res[‘session_key‘] if ‘session_key‘ in res else None
        if not openid:
            return Response({‘message‘: ‘微信调用失败‘}, status=status.HTTP_503)

        # 判断用户是否第一次登录
        try:
            user = User.objects.get(openid=openid)
        except Exception:
            # 微信用户第一次登陆,新建用户
            username = request.data.get(‘nickname‘)
            sex = request.data.get(‘sex‘)
            avatar = request.data.get(‘avatar‘)
            user = User.objects.create(username=username, sex=sex, avatar=avatar)
            user.set_password(openid)

        # 手动签发jwt
        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)

        resp_data = {
            "user_id": user.id
            "username": user.username,
            "avatar": user.avatar,
            "token": token,
        }

        return Response(resp_data)
    

补充:jwt的配置

REST_FRAMEWORK = {
  ‘DEFAULT_AUTHENTICATION_CLASSES‘: (
  ‘rest_framework_jwt.authentication.JSONWebTokenAuthentication‘,
  ‘rest_framework.authentication.SessionAuthentication‘,
  ‘rest_framework.authentication.BasicAuthentication‘,
  ),
}

JWT_AUTH = {
  # 指明token的有效期
  ‘JWT_EXPIRATION_DELTA‘: datetime.timedelta(days=7),
}

原文地址:https://www.cnblogs.com/zyxzyy/p/10207278.html

时间: 2024-07-30 20:24:46

django-微信小程序登录的相关文章

微信小程序登录对接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这个字段 微信

SpringBoot整合微信小程序登录

1. 开发前准备 1.1 前置知识 java基础 SpringBoot简单基础知识 1.2 环境参数 开发工具:IDEA 基础环境:Maven+JDK8 所用技术:SpringBoot.lombok.mybatisplus.微信小程序 SpringBoot版本:2.1.4 1.3 涉及知识点 微信小程序登录流程 2. 微信小程序登录流程 微信小程序登录流程涉及到三个角色:小程序.开发者服务器.微信服务器 三者交互步骤如下: 第一步:小程序通过wx.login()获取code. 第二步:小程序通过

flask与微信小程序登录(后端)

开发微信小程序时,接入小程序的授权登录可以快速实现用户注册登录的步骤,是快速建立用户体系的重要一步.这篇文章将介绍 python + flask + 微信小程序实现用户快速注册登录方案(本文主要进行后端逻辑的梳理,小程序端逻辑只写了必要的部分,如有需要,请点击连接阅读官方开发文档) 官方给出的微信小程序登录时序图如下: 这个流程分为两大部分: 小程序使用 wx.login() API 获取 code,并由开发者后端服务器换取open_id 和 session_key,小程序使用 wx.getUs

微信小程序--登录流程梳理

前言 微信小程序凡是需要记录用户信息都需要登录,但是也有几种不同的登录方式,但是在小程序部分的登录流程是一样的.之前就朦朦胧胧地用之前项目的逻辑改改直接用了,这个新项目要用就又结合官方文档重新梳理了下,并记录一下,好记性不如烂笔头嘛,哈哈. 几种登录流程设计 利用OpenId 创建新用户 这种方式我的理解大体上就是一种静默登录,获取用户信息之后解密用户信息并通过OpenId直接创建新用户 利用Unionid 创建新用户 这种方式的特点是可以利用Unionid实现多个小程序.公众号.已有登录体系的

微信小程序登录那些事

最近团队在开发一款小程序,都是新手,一边看文档,一边开发.在开发中会遇到各种问题,今天把小程序登录这块的流程整理下,做个记录. 小程序的登录跟平时自己APP这种登录验证还不太一样,多了一个角色,那就是微信服务器. 根据微信官方提供的登录流程时序图可以清楚的了解小程序登录需要多少个步骤,下面我们来总结下: 小程序启动,通过wx.login()获取code 开发者服务器需要提供一个登录的接口,参数就是小程序获取的code 登录接口收到code后,调用微信提供的接口进行code的验证 得到验证结果,成

微信小程序登录 .net 后端实现

1:前端获取用户凭证code 传送请求获得openId(用户唯一标识)     在页面的Onlaunch 方法中,调用wx.login 方法 https://developers.weixin.qq.com/miniprogram/dev/api/wx.login.html 这一步获取登录凭证,通过凭证调用本地后台接口,获取用户openId sessionKey等,本地后台的接口调用方法参考第四步 注意点: 1:通常我们会把用户的session_key 存取到后台的session会话中,但是在微

[转]微信小程序登录数据解密以及状态维持

本文转自:http://www.cnblogs.com/cheesebar/p/6689326.html 学习过小程序的朋友应该知道,在小程序中是不支持cookie的,借助小程序中的缓存我们也可以存储一些信息,但是对于一些比较重要的信息,我们需要通过登录状态维持来保存,同时,为了安全起见,用户的敏感信息,也是需要加密在网络上传输的. 前台,service.封装了http请求,同时封装了getSession(通过code获取服务器生成的session).getUserInfo(获取用户信息).ge

对于微信小程序登录的理解图

有两种获取用户信息的方案. 1.不包含敏感信息openId 的json对象(包含:nickname.avatarUrl等基本信息) 2.包含敏感信息openId的基本信息. 第一种获取方案 1.首先调用wx.login()接口 让用户授权验证,也就是我们肉眼观察到的,你是否对xxxxx授权这种信息. 2.用户成功授权后,调用wx.getUserInfo() 接口获取用户信息. 完整代码如下 wx.login({ success:function(){ wx.getUserInfo({ succe

微信小程序登录逻辑

wx.getStorage({ key: 'session_id', success: function(res) { //如果本地缓存中有session_id,则说明用户登陆过 console.log("本地缓存中的session_id:" + res.data) //判断微信服务器session是否有效 wx.checkSession({ success: function(res) { console.log("处于登录态,session有效"); //如果已

微信小程序登录流程

微信登陆流程 微信多个载体(APP微信授权,微信公众号授权登陆),openId是不一致的,但是unionId是一致的 所以在走流程时, 先判断unionId在数据库中存在不存在 存在,拿unionId去数据库换token,获取用户信息,更新openId,---首页 不存在,在启动页,让用户点击授权登陆,获取用户信息,再进行手机号授权 微信授权手机号 ---首页 登陆注册手机号 ---首页 代码方面: 进入启动页 wx.login();//获取code,code只能获取一次 将code传给后端,换