做小程序登录思考问题:
- 问题一:不想在小程序里总输入自己平台的账号密码,怎么与微信关联;
- 问题二:关联了微信也要可以切换账号使用;
- 问题三:不注册账号也可以在小程序里体验使用,必要时提示去登录;
- 问题四:如果打开小程序是我们项目自己的登录注册页面(体验较
微信登录获取openID
//不需要微信授权既可获取微信小程序登录API获取code
wx.login({
success: function (res) {
//获取code返回值如下:
//code:"0619IaNe0L8gHz1VMINe0WgjNe09IaNC"
//errMsg:"login:ok"
//code每次请求返回都不同,并且code使用一次后作废,
//即使不使用,下一次请求code,上一次的code也作废。
}
})
- 得到code将code传给服务器
- 服务器post请求接口https://api.weixin.qq.com/sns/jscode2session
小程序官方更新将此请求改为GET请求了
https://api.weixin.qq.com/sns/jscode2session
参数{
appid,
secret,
js_code = code,
grant_type = authorization_code
}
返回数据{
session_key,
openid
}
还想获取更多个人信息要如何做?
- 如果授权获可以取用户信息wx.getUserInfo得到iv,encryptedData,rawData,signature
- 将得到的iv,encryptedData 和wx.login 得到的code传给服务器
- 服务器post请求接口https://api.weixin.qq.com/sns/jscode2session
- 服务端解密数据encryptedData 可以获取userinfo信息和unionId
服务端解密数据encryptedData
对称解密使用的算法为 AES-128-CBC,数据采用PKCS#7填充。
对称解密的目标密文为 Base64_Decode(encryptedData)。
对称解密秘钥 aeskey = Base64_Decode(session_key), aeskey 是16字节。
对称解密算法初始向量 为Base64_Decode(iv),其中iv由数据接口返回。
解密encryptedData数据
{
"openId":"",
"nickName":"ZIM東",
"gender":1,
"language":"zh_CN",
"city":"",
"province":"",
"country":"",
"avatarUrl":"",
"unionId":"",
"watermark":{
"timestamp":1523433831,
"appid":""
}
}
在登录小程序之前,既没有关注过公众号,也没有登录过公众号,
更没有使用微信登录的方式登录过app。
通过 wx.login 的到的 code 解密后未返回 unionid
另外,为了应用能校验数据的有效性,会在敏感数据加上数据水印( watermark )
appid 敏感数据归属appid,开发者可校验此参数与自身appid是否一致
timestamp 敏感数据获取的时间戳, 开发者可以用于数据时效性校验
会话密钥session_key有效性
开发者如果遇到因为session_key不正确而校验签名失败或解密失败,请关注下面几个与session_key有关的注意事项。
1.wx.login()调用时,用户的session_key会被更新而致使旧session_key失效。
开发者应该在明确需要重新登录时才调用wx.login(),
及时通过登录凭证校验接口更新服务器存储的session_key。
2.微信不会把session_key的有效期告知开发者。
我们会根据用户使用小程序的行为对session_key进行续期。
用户越频繁使用小程序,session_key有效期越长。
3.开发者在session_key失效时,可以通过重新执行登录流程获取有效的session_key。
使用接口wx.checkSession()可以校验session_key是否有效,
从而避免小程序反复执行登录流程。
4.当开发者在实现自定义登录态时,
可以考虑以session_key有效期作为自身登录态有效期,
也可以实现自定义的时效性策略。
5.wx.login() 之后再获取wx.getUserInfo()
微信如何授权小程序获取用户信息: 为优化用户体验,使用 wx.getUserInfo 接口直接弹出授权框的开发方式将逐步不再支持。 从2018年4月30日开始,小程序与小游戏的体验版、开发版调用 wx.getUserInfo 接口, 将无法弹出授权询问框,默认调用失败。正式版暂不受影响。 开发者可使用以下方式获取或展示用户信息: 一、小程序: 1、使用 button 组件,并将 open-type 指定为 getUserInfo 类型,获取用户基本信息。 详情参考文档: https://developers.weixin.qq.com/miniprogram/dev/component/button.html 2、使用 open-data 展示用户基本信息。 详情参考文档: https://developers.weixin.qq.com/miniprogram/dev/component/open-data.html
登录流程图
图片.png👆原图地址:https://blog.csdn.net/dingjianmin/article/details/75137934
图片.png注意:开发者后台拿到开放数据后可以对数据进行校验签名和解密,来保证数据不被篡改。
图片.png签名校验以及数据加解密涉及用户的会话密钥session_key。
开发者应该事先通过 wx.login 登录流程获取会话密钥 session_key 并保存在服务器。
为了数据不被篡改,开发者不应该把session_key传到小程序客户端等服务器外的环境。
数据签名校验
为了确保 开放接口 返回用户数据的安全性,微信会对明文数据进行签名。
开发者可以根据业务需要对数据包进行签名校验,确保数据的完整性。
通过调用接口(如 wx.getUserInfo)获取数据时,接口会同时返回 rawData、signature,
其中 signature = sha1( rawData + session_key )
开发者将 signature、rawData 发送到开发者服务器进行校验。
服务器利用用户对应的 session_key 使用相同的算法计算出签名 signature2 ,
比对 signature 与 signature2 即可校验数据的完整性。
官方数据签名校验
https://developers.weixin.qq.com/miniprogram/dev/api/signature.html#wxchecksessionobject
全部文章地址:www.freefook.com
网友评论