热门标签 | 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”域名下的接口请求请全部通过后台服务器发起,请勿直接通过小程序的前端代码发起。 



推荐阅读
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社区 版权所有