# 云托管小程序登录流程优化

微信云托管提供的是后端云服务,从一定程度上来说,和你之前使用的服务器一样,都是为小程序的运行提供后端支撑的。

微信云托管有很多优势,除了容器化之外,最核心的,就是其强大的微信生态属性。

# 小程序原始登录

如果你用的是服务器,要判定一个小程序用户到底是谁,你可以通过两种形式:

第一种,按照一个 WEB 网页的思维来解决,不管是谁,直接先用户名密码登录,或者手机号发送短信登录,握手验证之后下发一个 token 令牌或者cookie,后续就直接按照这个令牌来标识,失效了就重新登录。

第二种,通过微信小程序的 wx.login 方法,获取一个code,然后拿着这个 code 在后端向微信服务器寻求认证,最终得到这个用户的身份ID,一般叫做openid(一个微信用户和一个小程序的关系称为openid,不同用户不同小程序的 openid 都不一样),由此我们可以判定身份,然后通过其他的登录附加(手机号认证、三要素、四要素认证,内部密码登录)将自己业务的用户库和微信的用户体系关联起来。这么做的好处就是,一经关联,后续就不需要再进行附加认证了,直接判定关系就可以确定用户身份和权限。这是典型的SSO单点登录

但无论如何,最终后端服务都需要根据用户标识来生成自定义登录态,用于后续业务逻辑中前后端交互时识别用户身份。

在文档中明确表示,wx.login后,通过auth.code2Session接口获取的会话密钥 session_key 是对用户数据进行加密签名的密钥。为了应用自身的数据安全,不应该把会话密钥下发到小程序,也不应该对外提供这个密钥。

# 微信云托管优化

当你的项目从服务器迁移到云托管中时,上述的 wx.login 获取 code 置换登录的流程就没有存在的必要了。

在小程序端,通过 wx.cloud.callContainer 向你的云托管服务发起请求时,你的服务会在 header 中获得该请求用户的全部信息。

header 说明
X-WX-OPENID 小程序用户 openid
X-WX-APPID 小程序 AppID
X-WX-UNIONID 小程序用户 unionid,并且满足 unionid 获取条件时有
X-WX-FROM-OPENID 资源复用情况下,小程序用户 openid
X-WX-FROM-APPID 资源复用情况下,使用方小程序 AppID
X-WX-FROM-UNIONID 资源复用情况下,小程序用户 unionid,并且满足 unionid 获取条件时有
X-WX-ENV 所在云环境 ID
X-WX-SOURCE 调用来源(本次运行是被什么触发)
X-Forwarded-For 客户端 IPv4 或IPv6 地址

你可以直接从 header 中拿到信息后做业务判定,然后进行业务正常服务。不需要 wx.login 登录,也不需要 code 换session

这个能力是不带任何条件的,小程序只要使用wx.cloud.callContainer,云托管服务收到这个请求,信息就自然而然带入进来了。

而且云托管免登录验证的这些信息,是由微信团队保证的,全程进行了加密处理,防刷防攻击。

不仅省去了 code 转换的步骤,而且还不需要自己做登录态了,因为你可以再任意请求都可以拿到用户的身份信息。

如果你坚持使用原本的auth.code2Session接口置换 code 登录这个流程,也没有什么问题,云托管并不会阻碍你这么用,但需要明确的是,这种情况并不会有任何安全、防刷的能力提升,完全是无视了微信云托管的生态属性,当成一个普通服务器来用。

# 总结

我们目睹了很多开发者因为接入的不严谨,导致各种信息泄漏和握手漏洞问题频发。我们也清楚的理解,并不是所有开发者都有大团队那么丰富的安全经验和高防配置,也无法自我发现和解决一些看起来非常常见的漏洞和泄漏风险。

微信云托管从一定程度上缩短了开发者之间服务安全的差距,全力保证服务可信性,深度和微信生态融合。在这一基础上,开发者只需要专注自身业务,省心省力。

公众号的授权登录流程原理以及云托管优化和小程序一样,具体可以看直播回放