背景
微信小程序只要与用户产生交互,都无法逃离用户信息管理,用户信息授权又是用户信息管理的最基础的服务。如想要深入学习用户授权,需要先了解一下 openID 和 UnionID 的区别。
openID 和 UnionID
- openID: openID 是微信生态下`应用的唯一标识`,开发者可以通过微信小程序(微信公众号)提供的静默授权拿到用户的 openID,这两个 openID 是独立的,无法关联到同一个用户。
- UnionID:UnionID 是微信生态下`用户的唯一标识`,开发者可以通过 UnionID 对不同应用对用户进行唯一绑定。
现在我们只需要记住 openID 是应用的唯一标识,UnionID 是用户的唯一标识就 ok。
用户授权的目标就是获取用户的唯一标识,便于我们的应用更好的管理用户信息,授权分为静默授权和阻断授权。
静默授权
静默授权,顾名思义就是开发者可以在用户无感中的情况下,获取到用户唯一标识(这里是单个应用的),通过这个唯一标识映射到我们系统的 userId,有了 userId,与后端服务的交互全都通了,最简单的用户管理应该哦了。
静默授权的过程是这样的:
- 调用 wx.login() 获取 临时登录凭证code
- 调用 auth.code2Session 接口,换取用户唯一标识 openID
- 调用本地后台服务,将 openID 映射到本地的 userId
详情过程可以参考微信官方文档提供的交互图 [猛击查看](https://developers.weixin.qq.com/miniprogram/dev/framework/open-ability/login.html)
对于只开发微信小程序这一个应用来说,拿到 openID 已经够用了,应用唯一标识就能很好的区分用户。
在实际应用中,我们会用到微信生态中的微信小程序、微信公众号等等,这个时候想在多个应用中唯一标识同一个用户,就需要用到 UnionID。
UnionID可以通过下面途径获取,摘自官方文档:https://developers.weixin.qq.com/miniprogram/dev/framework/open-ability/union-id.html
- 调用接口 wx.getUserInfo,从解密数据中获取 UnionID。注意本接口需要用户授权,请开发者妥善处理用户拒绝授权后的情况。
- 如果开发者帐号下存在同主体的公众号,并且该用户已经关注了该公众号。开发者可以直接通过 wx.login + code2Session 获取到该用户 UnionID,无须用户再次授权。
- 如果开发者帐号下存在同主体的公众号或移动应用,并且该用户已经授权登录过该公众号或移动应用。开发者也可以直接通过 wx.login + code2Session 获取到该用户 UnionID ,无须用户再次授权。
- 用户在小程序(暂不支持小游戏)中支付完成后,开发者可以直接通过getPaidUnionId接口获取该用户的 UnionID,无需用户授权。注意:本接口仅在用户支付完成后的5分钟内有效,请开发者妥善处理。
- 小程序端调用云函数时,如果开发者帐号下存在同主体的公众号,并且该用户已经关注了该公众号,可在云函数中通过 cloud.getWXContext 获取 UnionID。
- 小程序端调用云函数时,如果开发者帐号下存在同主体的公众号或移动应用,并且该用户已经授权登录过该公众号或移动应用,也可在云函数中通过 cloud.getWXContext 获取 UnionID。
阻断授权
阻断授权顾名思义就是需要用户参与才能完成的授权操作,一般是为了获得用户手机号和用户信息。
用户手机号
具体可以参考访问文档提供的API: [猛击查看](https://developers.weixin.qq.com/miniprogram/dev/framework/open-ability/login.html)
用户信息
具体可以参考访问文档提供的API: [猛击查看](https://developers.weixin.qq.com/miniprogram/dev/api/open-api/user-info/wx.getUserInfo.html)
真实案例
我们用户体系是这样设计的,userId 和 token 共同决定用户的有效性。
- 静默授权的设计方案
- 手机号授权设计方法
- 用户信息授权
不同的业务场景处理方式会有差异,这个也只是针对当下我们的业务场景,希望对你有所有帮助,也欢迎大家一起交流沟通学习。