微信小程序登录态验证流程

小程序调用wx.login得到code.

调用接口获取登录凭证(code)进而换取用户登录态信息,包括用户的唯一标识(openid) 及本次登录的 会话密钥(session_key)。用户数据的加解密通讯需要依赖会话密钥完成。

小程序调用wx.getUserInfo得到rawData, signatrue, encryptData.

小程序调用server获取token接口, 传入code, rawData, signature, encryptData.

server调用微信提供的jsoncode2session接口获取openid, session_key, 调用失败应给予客户端反馈, 微信侧返回错误则可判断为恶意请求, 可以不返回. 微信文档链接

这是一个 HTTP 接口,开发者服务器使用登录凭证 code 获取 session_key 和 openid。其中 session_key 是对用户数据进行加密签名的密钥。为了自身应用安全,session_key 不应该在网络上传输

接口地址:"https://api.weixin.qq.com/sns/jscode2session?appid=APPID&secret=SECRET&js_code=JSCODE&grant_type=authorization_code"

server计算signature, 并与小程序传入的signature比较, 校验signature的合法性, 不匹配则返回signature不匹配的错误. 不匹配的场景可判断为恶意请求, 可以不返回. 微信文档链接

通过调用接口(如 wx.getUserInfo)获取敏感数据时,接口会同时返回 rawData、signature,其中 signature = sha1( rawData + session_key )

将 signature、rawData、以及用户登录态发送给开发者服务器,开发者在数据库中找到该用户对应的 session-key,使用相同的算法计算出签名 signature2 ,比对 signature 与 signature2 即可校验数据的可信度。

使用第4步返回的session_key解密encryptData, 将解得的信息与rawData中信息进行比较, 需要完全匹配, 解得的信息中也包括openid, 也需要与第4步返回的openid匹配. 解密失败或不匹配应该返回客户相应错误. 微信文档链接

接口如果涉及敏感数据(如wx.getUserInfo当中的 openid ),接口的明文内容将不包含敏感数据。开发者如需要获取敏感数据,需要对接口返回的加密数据( encryptData )进行对称解密。 解密算法如下:

对称解密使用的算法为 AES-128-CBC,数据采用PKCS#7填充。

对称解密的目标密文为 Base64_Decode(encryptData),

对称解密秘钥 aeskey = Base64_Decode(session_key), aeskey 是16字节

对称解密算法初始向量 iv = aeskey, 同样是16字节

rawData格式:

{

"nickName": "Band",

"gender": 1,

"language": "zh_CN",

"city": "Guangzhou",

"province": "Guangdong",

"country": "CN",

"avatarUrl": "http://wx.qlogo.cn/mmopen/vi_32/1vZvI39NWFQ9XM4LtQpFrQJ1xlgZxx3w7bQxKARol6503Iuswjjn6nIGBiaycAjAtpujxyzYsrztuuICqIM5ibXQ/0"

}

encryptData解密之后格式:

{

    "openId": "OPENID",

    "nickName": "NICKNAME",

    "gender": 1,

    "city": "CITY",

    "province": "PROVINCE",

    "country": "COUNTRY",

    "avatarUrl": "AVATARURL",

    "unionId": "UNIONID"

}

使用session_key作为密钥, 加密至少包括openid, timestamp, random(随机值), version(版本)的内容, 得到token. 加密算法可以参考微信对encryptData的加密算法. server应该缓存session_key, 缓存的过期时间不应该小于token的过期时间. 将openid, token返回给客户端.

小程序每次业务请求都必须带上openid和token, server验证token的合法性: token能否被正常解密; 解密后的openid和传入的openid是否一致; 解密后可得到token的生成时间, token是否过期. 全部校验通过即可正常处理业务请求.

©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 微信小程序的运行环境不是在浏览器下运行的。所以不能以cookie来维护登录态。下面我就来说说我根据官方给出的方法来...
    Sven_qi阅读 4,201评论 0 2
  • 注意:代码自己动手写,不要复制! GitHub 一、接入微信第三方登录准备工作。 移动应用微信登录是基于OAuth...
    大冲哥阅读 15,239评论 0 7
  • 昨天早上看到新闻,浙江金华的杨师傅靠着卖烧饼月入最少三万,八年来攒下七套房,网友们瞬间哗然:还上什么班啊,都去卖烧...
    无为育儿阅读 396评论 0 2
  • 如果时光能消磨平仄的曾经; 或许遗憾能告别褪色的年华。 如果岁月能诠释青春的彷徨; 或许回首能填满年少...
    林六壬阅读 646评论 11 1
  • 【重阳·再现】 九九重阳好时节 旧古诗词漫四野 适逢菊黄登高望 秋来茱萸鬓如霜 遥知友朋他乡在 倦身回首难释怀 唯...
    騏开得勝阅读 218评论 1 1