专栏首页极乐技术社区一文详解小程序授权、登录、session_key和unionId

一文详解小程序授权、登录、session_key和unionId

微信应用的一个很大的优势就在于使用过程中是不需要进行注册和显式登录的,大部分问题基本上可以一键解决。但是在授权、登录和获取用户信息的过程中都发生了哪些事情,今天我们就来讨论一下。这篇文章主要分析以下几个问题:

  • 授权和登录的意义
  • session_key 的作用
  • unionId 的作用,有哪些获取途径
  • 在应用中如何保存用户登录态

1

授权和登录的意义

首先必须要明白,授权和登录实际上是两个操作。

1.1 授权

那授权的作用是啥呢?从小程序官方文档中我们可以看到授权操作只需通过wx.authorize() 接口便可以完成,以下是文档中对授权操作的描述:

提前向用户发起授权请求。调用后会立刻弹窗询问用户是否同意授权小程序使用某项功能或获取用户的某些数据,但不会实际调用对应接口。如果用户之前已经同意授权,则不会出现弹窗,直接返回成功。

也就是说,授权过程实际上只是在小程序前端获得了操作部分wx 接口的访问许可,这个过程实际上是不会与开发者服务器发生任何关系的。那这些访问许可包含哪些内容呢?再来看微信官方提供的scope 列表:

注:新版api已废弃wx.authorize()

1.2 登录

所谓的登录就是要让开发者服务器知道当前的用户是谁?在传统的web 应用中,我们必须要让用户输入账号和密码才能实现登录操作。但是在微信应用中,我们可以通过微信服务器来完成这个操作,获取到与当前用户对应的唯一标志(openId),具体操作实现流程如下:

wx.login()用来做登录的方法,调用接口获取登录凭证,code发送给后端用于置换session_key和openid等数据。每个用户相对于每个微信应用(公众号或者小程序)的openId 是唯一的,也就是说一个用户相对于不同的微信应用会存在不同的openId。

这是小程序官方的一张登录流程图,现在就来解读一下这个流程

  • 前端wx.login()获取code,调用后端接口,将得到的code发送到后端
  • 后端调用微信接口,用appid+appsecret+code发送过去,置换到session_key+openid,以前是不能置换unionid的,但是现在在满足以下条件可以置换到unionid
  1. 微信开放平台下存在同主体的App、公众号、小程序
  2. 用户关注了某个相同主体公众号,或曾经在某个相同主体App、公众号上进行过微信登录授权 同时满足以上两个条件就能拿到用户unionid,这样一来,就能在wx.login()准确识别出用户是谁
  • 自定登录态与openid和session_key关联,实际就是生成一个与openid,session_key关联的token,下发给前端
  • 前端将后端下发的token存入缓存,在后面的接口请求中带上自定登录态

以上就是小程序的整个登录流程,可以看到其实并不是一定要wx.getUserInfo()才能拿到用户的信息,在特定的条件下,通过wx.login()的调用拿到unionId也能后端数据库里拿到用户信息。登录过程中涉及session_key和unionId,于是又引出了下面的问题。

2

session_key 的作用

那么,session_key在登录的过程中或者登录完成后起什么作用呢?一起来看一下。

2.1 wx.getUserInfo

首先来看一下wx.getUserInfo 这个api:

在设置withCredentials 属性为true 的情况下,这个api 可以拿到encryptedData,iv 等敏感信息,encryptedData 需要使用session_key 进行解密,解密后可以拿到的数据如下:

也就是说,session_key的作用之一是将小程序前端从微信服务器获取到的encryptedData 解密出来,获取到openId 和unionId等信息。

但是在1.2登录过程中可以看到开发者服务器是能够直接拿到用户的openId信息,而且unionId 也是有其他获取途径,所以session_key 在这里的作用看起来有点鸡肋。

2.2 getPhoneNumber

session_key 更重要的作用大概体现在获取用户手机方面(可能还包含其他敏感信息获取api)。

从文档中可以看到getPhoneNumber 返回的用户数据是加密过的,只有使用session_key才能解密,而小程序前端没有session_key,所以无法获取到用户的手机,只能传到开发者服务器进行处理。

3

unionId 的作用,有哪些获取途径?

3.1、UnionID机制说明

如果公司拥有多个移动应用、网站应用、和公众帐号(包括小程序),可通过unionid来区分用户的唯一性,因为只要是同一个微信开放平台帐号下的移动应用、网站应用和公众帐号(包括小程序),用户的unionid是唯一的。换句话说,同一用户,对同一个微信开放平台下的不同应用,unionid是相同的。

Tip:unionid 用于识别同一主体下不同账号之间的用户。举例说明:就是公司有A订阅号,B服务号,同一个人关注A和B,会得到不同的OPENID,但是会得到相同的unionid。这样就可以识别到相同的用户,用于不同账号之间打通用户关系。

3.2、UnionID获取途径

必须有一个微信开放平台账号绑定了至少一个微信公众账号或者网站应用或者小程序,否则UnionID返回null。绑定了开发者帐号的小程序,可以通过下面3种途径获取UnionID。

方法一:调用接口wx.getUserInfo,从解密数据中获取UnionID。注意本接口需要用户授权,请开发者妥善处理用户拒绝授权后的情况。

方法二:如果开发者帐号下存在同主体的公众号,并且该用户已经关注了该公众号。开发者可以直接通过wx.login获取到该用户UnionID,无须用户再次授权。

方法三:如果开发者帐号下存在同主体的公众号或移动应用,并且该用户已经授权登录过该公众号或移动应用。开发者也可以直接通过wx.login获取到该用户UnionID,无须用户再次授权。

4

在应用中如何保存用户登录态

保存用户登录态,一直以来都有两种解决方案:前端保存和后端保存。

4.1 后端保存

在1.2 步骤③ 中写session 的时候可以直接设定过期时间,定期通知小程序前端重新进行登录(wx.login)。

4.2 前端保存

因为session_key 存在时效性问题(毕竟是用来查看敏感信息),而小程序前端可以通过wx.checkSession() 来检查session_key 是否过期。所以可以通过这个来作为保存用户登录态的机制,这也是小程序文档中推荐的方法:

本文分享自微信公众号 - 极乐技术社区(wxapp-union)

原文出处及转载信息见文内详细说明,如有侵权,请联系 yunjia_community@tencent.com 删除。

原始发表时间:2020-12-12

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • .Net之微信小程序获取用户UnionID

      在实际项目开发中我们经常会遇到账号统一的问题,如何在不同端或者是不同的登录方式下保证同一个会员或者用户账号唯一(便于用户信息的管理)。这段时间就有一个这样的...

    追逐时光者
  • 微信小程序获取用户信息

    在微信小程序中,如果想获取用户的昵称等信息可以不用另外写后台,如果需要获取用户的unionId,则需要后台来提供获取sessionKey和解码encrypted...

    OECOM
  • 小程序(3):授权登录

    判断是否授权,如果没有,则显示授权按钮。注意上面的open-type="getUserInfo",这个会自动调起授权框。看一下js

    小尘哥
  • 小程序静默登录方案设计

    同一个用户的这两个 ID 对于同一个小程序来说是永久不变的,就算用户删了小程序,下次用户进入小程序,开发者依旧可以通过后台的记录标识出来。那么如何获取OpenI...

    小丑同学
  • SpringBoot实现微信小程序登录的完整例子

    根据流程图描述,主要步骤有以下几步 1、小程序端调用 wx.login()向微信接口服务获取 临时登录凭证code ,并上传至开发者服务端。 2、开发者服务...

    智慧zhuhuix
  • 微信小程序避坑指南

     详见官方文档:https://developers.weixin.qq.com/miniprogram/dev/framework/client-lib/cl...

    smy
  • 微信小程序授权登录与用户信息保存详解(微信报修小程序源码讲解六)

    提醒:小程序端源码已经更新整理,相比旧源码,新源码简洁、结构清晰、需要的同学及时找我获取源码。

    热心的程序员
  • 小程序登录及用户信息和手机号的获取

    需要用户主动触发才能发起获取手机号接口,所以该功能不由 API 来调用,需用 <button> 组件的点击来触发。获取手机号文档。

    超超不会飞
  • 微信小程序网络通信(一)

    先调用 wx.login(Object object) 获取临时登录凭证,及code,然后wx.request()方法将登录凭证发送到开发者服务器,开发者服务器...

    mySoul
  • 微信小程序调用接口获取登录获取用户信息

    沈唁
  • 【微信官方】获取用户信息方案介绍

    背景 ✦✦01✦✦ 小程序一个比较重要的能力就是获取用户信息,也就是使用 wx.getUserInfo 接口。我们发现几乎所有的小程序都会调用这个接口。虽然我...

    连胜
  • beego微信小程序登录、确权、解密

    版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/hotqin888/article/det...

    hotqin888
  • 微信账户体系扫盲

    一个用户对于同主体微信小程序/公众号/APP的标识,开发者需要在微信开放平台下绑定相同账号的主体。开发者可通过 UnionId,实现多个小程序、公众号、甚至AP...

    薛定喵君
  • 微信小程序之登录态探索

    登录,几乎什么项目都会用到,其重要性不言而喻,而小程序的登录却一直是为人头疼的一件事,这里我分享下我们在小程序登录上的探索。

    grain先森
  • 小程序中神秘的用户数据

    上一篇文章手把手教会你小程序登录鉴权介绍了小程序如何进行登录鉴权,那么一般小程序的用户标识可以使用上文所述微信提供的jscode2session接口来换取,小程...

    腾讯IVWEB团队
  • 微信小程序登入流程

    小小咸鱼YwY
  • 小程序的登录与静默续期

    每一个有数据交互的小程序,都会涉及到登录、token 等问题,openid 又是什么呢?怎么使用静默续期,来提升用户体验呢?

    ITer.996
  • 微信小程序开发(一) 微信登录流程

    做过微信登录的都知道,我们需要一个标识来记录用户的身份的唯一性,在微信中unionId就是我们所需要的记录唯一ID,那么如何拿到unionId就成了关键,我将项...

    开发者技术前线
  • 小程序 报错 errcode: 40029, errmsg: "invalid code, hints: [ req_id: HQd79a0747th31 ]

    版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/u011415782/article/de...

    泥豆芽儿 MT

扫码关注云+社区

领取腾讯云代金券