热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

小程序的授权和登陆

参考资料:https://blog.csdn.net/qq_33594380/article/details/80431582https://blog.csdn.net/u013451157/ar

参考资料:
https://blog.csdn.net/qq_33594380/article/details/80431582
https://blog.csdn.net/u013451157/article/details/80286035

一丶授权
1.首先,小程序的授权和登陆是两个不同的操作。
2.授权,是永久的。可以手动在小程序右上角的点点点进去,取消授权。
3.授权分为用户信息授权,地理位置授权,录音功能授权,摄像头授权等等。最常用的授权是用户信息授权。
4.旧代码授权使用wx.authorize,不过如今已经废弃不能用了。
5.如今只能通过按钮点击授权,代码如下:


js回调代码:
getUserInfo: function(e) {
    console.log(e)
    app.globalData.userInfo = e.detail.userInfo
    this.setData({
      userInfo: e.detail.userInfo,
      hasUserInfo: true
    })
  }

二丶登陆

在传统应用中,输入账号和密码实现登录。
在小程序中,通过微信服务器获取到 openId 实现登陆。
PS:openid
每个用户相对于每个微信应用(公众号或小程序等)的openId 是唯一的。也就是说一个用户相对于不同的微信应用会存在不同的openId。
PS:unionid
同一用户,对同一个微信开放平台下的不同应用,unionid是相同的

小程序登陆步骤如下:
1.注册微信小程序、登录后台在设置中获得appId和secret(密钥)
2.调用wx.login()接口获取登录凭证code
3.调用wx.request()接口把code发送到服务器后台
4.服务器后台,使用appId、secret、code访问微信服务器,获取openid和session_key
5.服务器定义加密字符串aaa对应openid和session_key,将aaa返回给前端
6.前端使用wx.setStorageSync() 保存aaa
当下次进入微信小程序的时候,
1.前端判断授权
2.前端获取wx.getStorage获取aaa
3.前端通过aaa获取session_key
4.前端通过wx.checkSession() 获取是否过期。
5.如果没有过期,那么不用再次登陆。


跟群里大佬聊天,有了新的理解
1.调用wx.login()接口获取登录凭证code
2.调用wx.request(),数据库没有openid,服务器获取openid,如果不存在就保存
4.服务器加密openid为3rd_openid, 3rd_openid有时间限制。
4.将3rd_openid传给前端
5.前端将3rd_openid保存在缓存,每次操作带上参数3rd_openid

再次进入小程序:
1.getStorageSync获取3rd_openid
2.每次操作带上参数3rd_openid
3.如果3rd_openid过期了,返回登陆界面
4.重新登陆,服务器获取openid,发现已经存在,返给你加密后的
但是有问题,就是没有密码。因为3rd_openid能在后台解出来openid,用户名和密码等信息。
后台的不是很了解了。

小程序的授权和登陆
4045079-bdf8f5df03c83f39.jpg

································
又有了新的理解
我们只需要formid和openid,为啥要微信登陆?只需要微信授权就可以了。
1.第一次进入,用户输入手机号,验证码登陆,
2.如果手机号和登陆吗正确,但是没有openid,后台返回一个需要openid的参数(后台推送需要openid)
3.前端wx.login将code发送给后台
4.后台保存openid,并返回3rd_openid
5.前端保存3rd_openid,每次发送请求带上3rd_openid
6.后台报错,超时间,前端再次验证码登陆,
https://www.cnblogs.com/zhangjiabin/p/8037523.html

PS:这里可能有人疑惑,既然有了user_id还要session_key干嘛。因为如果session_key过期了,你又不再次登陆(wx.login),那么你在微信服务器眼里就是没有登陆的。那么很多功能不能使用。比如支付,推送等。
PS:我不使用openid相关的功能,是不是就不用这么麻烦了?是的。
PS:登陆时间(session_key)持续时间长度,不是固定的,是根据你使用频率决定
PS:官方提供的,获取openid和session_key的接口如下:
https://api.weixin.qq.com/sns/jscode2session?appid=APPID&secret=SECRET&js_code=JSCODE&grant_type=authorization_code
小程序登陆步骤图:

小程序的授权和登陆
login1.png
// 登录
wx.login({
  success: res => {
    // ------ 获取凭证 ------
    var code = res.code;
    if (code) {
      // console.log('获取用户登录凭证:' + code);
      // ------ 发送凭证 ------
      wx.request({
        url: '后台服务器地址',
        data: { code: code },
        method: 'POST',
        header: {'content-type': 'application/json'},
        success: function (res) {
          if (res.statusCode == 200) {
            // console.log("获取到的openid为:" + res.data)
            // that.globalData.openid = res.data
            wx.setStorageSync('openid', res.data)
          } else {
            console.log(res.errMsg)
          }
        },
      })
    } else {
      console.log('获取用户登录失败:' + res.errMsg);
    }
  }
})

那么,有人会问了,如果小程序,不通过后台服务器,而是直接访问微信服务器获取openid和session_key不可以么?当然可以。但是不安全。

因为小程序的开发者密码(AppSecret)是一个非常重要的字段,使用该密码可以调用小程序的所有后台接口。请不要将该字段放置在微信小程序的前端代码中,因为微信手机客户端容易被反编译并轻松获得Appsecret,造成重大的安全威胁。开发者应将Appsecret保存到后台服务器中。微信公众平台小程序后台的服务器地址设置也将禁止将“api.weixin.qq.com”域名的配置,所有对于“api.weixin.qq.com”域名下的接口请求请全部通过后台服务器发起,请勿直接通过小程序的前端代码发起。 



推荐阅读
  • 12月16日JavaScript变量、函数、流程、循环等***线上九期班
    12月16日JavaScript变量、函数、流程、循环等***线上九期班 ... [详细]
  • 微信小程序:授权登录与手机号绑定
    本文详细介绍了微信小程序中用户授权登录及绑定手机号的流程,结合官方指引和实际开发经验,提供了一套完整的实现方案,帮助开发者更好地理解和应用。 ... [详细]
  • 微信小程序中实现位置获取的全面指南
    本文详细介绍了如何在微信小程序中实现地理位置的获取,包括通过微信官方API和腾讯地图API两种方式。文中不仅涵盖了必要的准备工作,如申请开发者密钥、下载并配置SDK等,还提供了处理用户授权及位置信息获取的具体代码示例。 ... [详细]
  • 本文详细介绍了优化DB2数据库性能的多种方法,涵盖统计信息更新、缓冲池调整、日志缓冲区配置、应用程序堆大小设置、排序堆参数调整、代理程序管理、锁机制优化、活动应用程序限制、页清除程序配置、I/O服务器数量设定以及编入组提交数调整等方面。通过这些技术手段,可以显著提升数据库的运行效率和响应速度。 ... [详细]
  • 本文介绍了如何在 Node.js 中使用 `setDefaultEncoding` 方法为可写流设置默认编码,并提供了详细的语法说明和示例代码。 ... [详细]
  • 深入解析Serverless架构模式
    本文将详细介绍Serverless架构模式的核心概念、工作原理及其优势。通过对比传统架构,探讨Serverless如何简化应用开发与运维流程,并介绍当前主流的Serverless平台。 ... [详细]
  • JavaScript中的数组是数据集合的核心结构之一,内置了多种实用的方法。掌握这些方法不仅能提高开发效率,还能显著提升代码的质量和可读性。本文将详细介绍数组的创建方式及常见操作方法。 ... [详细]
  • 本文详细介绍了Java的安装、配置、运行流程以及有效的学习方法,旨在帮助初学者快速上手Java编程。 ... [详细]
  • 本文介绍了一个优化过的JavaScript函数,用于从API获取电影信息并渲染到网页上,同时注册Service Worker以提升用户体验和性能。 ... [详细]
  • Symfony是一个功能强大的PHP框架,以其依赖注入(DI)特性著称。许多流行的PHP框架如Drupal和Laravel的核心组件都基于Symfony构建。本文将详细介绍Symfony的安装方法及其基本使用。 ... [详细]
  • 本文介绍如何使用RFC 5545重复规则在C#中实现类似于Google日历中的事件安排功能,特别是针对每月特定工作日的事件。我们将探讨如何精确设置这些规则以确保事件按照预期频率和日期触发。 ... [详细]
  • 在编译BSP包过程中,遇到了一个与 'gets' 函数相关的编译错误。该问题通常发生在较新的编译环境中,由于 'gets' 函数已被弃用并视为安全漏洞。本文将详细介绍如何通过修改源代码和配置文件来解决这一问题。 ... [详细]
  • 理解文档对象模型(DOM)
    本文介绍了文档对象模型(DOM)的基本概念,包括其作为HTML文档的节点树结构,以及如何通过JavaScript操作DOM来实现网页的动态交互。 ... [详细]
  • 本文详细探讨了JavaScript中四种获取CSS样式的不同方法:style、currentStyle、getComputedStyle和getBoundingClientRect。每种方法的适用场景及其兼容性问题,并提供了解决方案。 ... [详细]
  • 本文探讨了在React项目中实现子组件向父组件传递数据的方法,包括通过回调函数和使用React状态管理工具。 ... [详细]
author-avatar
张小白
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有