前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >一文详解小程序授权、登录、session_key和unionId

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

作者头像
极乐君
发布于 2020-12-30 02:58:55
发布于 2020-12-30 02:58:55
12.2K0
举报
文章被收录于专栏:极乐技术社区极乐技术社区

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

  • 授权和登录的意义
  • 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 是否过期。所以可以通过这个来作为保存用户登录态的机制,这也是小程序文档中推荐的方法:

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2020-12-12,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 极乐技术社区 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
小程序静默登录方案设计
同一个用户的这两个 ID 对于同一个小程序来说是永久不变的,就算用户删了小程序,下次用户进入小程序,开发者依旧可以通过后台的记录标识出来。那么如何获取OpenId和UnionId呢?
小丑同学
2021/05/18
2.5K0
小程序静默登录方案设计
微信小程序获取unionid与openid
unionid来区分用户的唯一性,在相同微信开放平台帐号下的移动应用、网站应用、小程序、公众号,用户的unionid是唯一的。也就是说,同一用户,对同一个微信开放平台下的不同应用,unionid是相同的。
ITer.996
2019/08/28
6.4K0
微信小程序获取unionid与openid
微信账户体系扫盲
一个用户对于同主体微信小程序/公众号/APP的标识,开发者需要在微信开放平台下绑定相同账号的主体。开发者可通过 UnionId,实现多个小程序、公众号、甚至APP 之间的数据互通
薛定喵君
2020/04/21
1.5K0
.Net之微信小程序获取用户UnionID
  在实际项目开发中我们经常会遇到账号统一的问题,如何在不同端或者是不同的登录方式下保证同一个会员或者用户账号唯一(便于用户信息的管理)。这段时间就有一个这样的需求,之前有个客户做了一个微信小程序商城(店主端的),然后现在又要做一个会员购物端的小程序商场。首先之前用户登录凭证都是使用微信openid来做的唯一标识,而现在客户需求是要做到用户在会员端小程序跳转到到店主端小程序假如之前该用户微信是在店主端审核通过的用户则不需要在进行资料提交审核操作,直接登录。所以,所以我们使用了UnionID来进行关联,如下是我们现在项目的基本流程(画的丑莫见怪)。
追逐时光者
2019/09/11
1.8K0
.Net之微信小程序获取用户UnionID
微信小程序登录方法,授权登陆及获取微信用户手机号
 ✅作者简介:              大家好五一快乐,我是痴心阿文,你们的学友哥,今天给大家分享微信小程序登录方法! 📃个人主页:痴心阿文的博客_CSDN博客-TypeScript.js,笔记,CSS领域博主 🔥本文前言:微信小程序登录方法,授权登陆及获取微信用户手机号 💖如果觉得博主的文章有帮到你的话,请👍支持一下博主哦🤞   🍉🍉🍉先看一下小程序的登陆流程 使用说明注意:     调用 auth.code2Session 接口,换取 用户唯一标识 OpenID 、
痴心阿文
2022/11/18
8740
微信小程序登录方法,授权登陆及获取微信用户手机号
小程序如何获取code
小程序调用wx.login() 获取 临时登录凭证code ,并回传到开发者服务器
达达前端
2022/04/29
2.6K0
小程序如何获取code
.NET Core 微信公众号小程序6种获取UnionID方法,你知道哪几种?
获取UnionID是开发微信公众号/小程序中很有必要的一个环节,特别是针对一个公司拥有多个公众号小程序而推出的机制,实现打通账户一体化,用UnionID来区分多平台的唯一性。
hailang2zh
2019/10/21
1.7K0
.NET Core 微信公众号小程序6种获取UnionID方法,你知道哪几种?
小程序登录的详细流程
前端在处理登录的时候似乎很简单。问侯后端开发人员要一个接口,然后写个界面,输入用户名/密码,点击登录按钮,登录功能就完成了。
terrence386
2022/07/14
2.2K0
小程序登录的详细流程
微信小程序:一文彻底搞懂openid和unionid
微信开发过程中,经常会遇到,一个企业有多个小程序和公众号,在不同的小程序和公众号中,会有不同的openid。如果想要确定是同一个人,就需要用到unionid机制。
极乐君
2020/09/30
57.4K2
微信小程序:一文彻底搞懂openid和unionid
小程序的登录与静默续期
每一个有数据交互的小程序,都会涉及到登录、token 等问题,openid 又是什么呢?怎么使用静默续期,来提升用户体验呢?
ITer.996
2019/08/28
2.7K0
小程序的登录与静默续期
beego微信小程序登录、确权、解密
版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/hotqin888/article/details/82532964
hotqin888
2018/09/11
2.3K0
【微信官方】获取用户信息方案介绍
背景 ✦✦01✦✦ 小程序一个比较重要的能力就是获取用户信息,也就是使用 wx.getUserInfo 接口。我们发现几乎所有的小程序都会调用这个接口。虽然我们在设计文档上有提出最好的设计是在真正要用户信息的情况下才去获取用户信息,不过很多开发者并没有按照我们的期望去做,导致用户在使用的时候有很多困扰。 归结起来有几点: 开发者在首页直接调用 wx.getUserInfo 进行授权,弹框有会使得一部分用户放弃小程序的使用。 开发者没有处理用户拒绝弹框的情况,有部分小程序强制要求用户授权头像昵称等信息才能继
连胜
2018/03/07
1.9K0
微信小程序调用接口获取登录获取用户信息
微信小程序 getPhoneNumber 获取手机号的功能需要需先调用 wx.login 接口,今天就来一篇 wx.login 接口和 wx.getUserInfo 接口的文章,这两个接口通常在小程序中还是十分常用的。 wx.login 调用接口获取登录凭证(code)进而换取用户登录态信息,包括用户的唯一标识(openid) 及本次登录的 会话密钥(session_key)等。用户数据的加解密通讯需要依赖会话密钥完成。 注:调用 login 会引起登录态的刷新,之前的 sessionKey 可能会失
沈唁
2018/05/24
6.9K1
【黄啊码】微信小程序登录流程+介绍wx.login和auth.code2Session
wx.login:微信小程序的登录方法,获取临时登录凭证code,并回传到开发者服务器。
黄啊码
2022/06/10
1.9K0
微信小程序获取用户信息
在微信小程序中,如果想获取用户的昵称等信息可以不用另外写后台,如果需要获取用户的unionId,则需要后台来提供获取sessionKey和解码encryptedData。
OECOM
2020/07/01
3.3K0
Spring Boot+微信小程序_保存微信登录者的个人信息
微信小程序开发平台,提供有一类 API,可以让开发者获取到微信登录用户的个人数据。这类 API 统称为开放接口。
一枚大果壳
2022/08/23
1.6K0
Spring Boot+微信小程序_保存微信登录者的个人信息
小程序用户登录架构设计
上一篇文章《小程序静默登录方案设计》提到过,小程序可以通过微信官方提供的登录能力方便地获取微信提供的用户身份标识,快速建立小程序内的用户体系。
Nealyang
2021/06/08
2.2K0
微信小程序:授权登录 + 基于token的身份验证详解
通过 wx.login() 获取到用户登录态之后,需要维护登录态。开发者要注意不应该直接把 session_key、openid 等字段作为用户的标识或者 session 的标识,而应该自己派发一个 session 登录状态 (请参考登录时序图)。对于开发者自己生成的 session,应该保证其安全性且不应该设置较长的过期时间。session 派发到小程序客户端之后,可将其存储在 storage ,用于后续通信使用。
极乐君
2020/08/11
39.2K1
11-微信小程序授权登录
小程序可以通过微信官方提供的登录能力方便地获取微信提供的用户身份标识,快速建立小程序内的用户体系。 登录流程:
度假的小鱼
2024/12/26
4640
11-微信小程序授权登录
Django实战-初识小程序授权登录
Django网络应用开发的5项基础核心技术包括模型(Model)的设计,URL 的设计与配置,View(视图)的编写,Template(模板)的设计和Form(表单)的使用。
小团子
2019/08/29
1.7K0
Django实战-初识小程序授权登录
相关推荐
小程序静默登录方案设计
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档