微信小程序之五:登录篇

做小程序登录思考问题:

  1. 问题一:不想在小程序里总输入自己平台的账号密码,怎么与微信关联;
  2. 问题二:关联了微信也要可以切换账号使用;
  3. 问题三:不注册账号也可以在小程序里体验使用,必要时提示去登录;
  4. 问题四:如果打开小程序是我们项目自己的登录注册页面(体验较
微信小程序之五:登录篇_第1张图片
图片.png

微信登录获取openID

//不需要微信授权既可获取微信小程序登录API获取code
wx.login({
    success: function (res) {
    //获取code返回值如下:
    //code:"0619IaNe0L8gHz1VMINe0WgjNe09IaNC"
    //errMsg:"login:ok"
    //code每次请求返回都不同,并且code使用一次后作废,
    //即使不使用,下一次请求code,上一次的code也作废。
    }
})
  1. 得到code将code传给服务器
  2. 服务器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
}

还想获取更多个人信息要如何做?

  1. 如果授权获可以取用户信息wx.getUserInfo得到iv,encryptedData,rawData,signature
  2. 将得到的iv,encryptedData 和wx.login 得到的code传给服务器
  3. 服务器post请求接口https://api.weixin.qq.com/sns/jscode2session
  4. 服务端解密数据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

登录流程图

微信小程序之五:登录篇_第2张图片
图片.png

原图地址:https://blog.csdn.net/dingjianmin/article/details/75137934

微信小程序之五:登录篇_第3张图片
图片.png

注意:开发者后台拿到开放数据后可以对数据进行校验签名和解密,来保证数据不被篡改。

微信小程序之五:登录篇_第4张图片
图片.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

你可能感兴趣的:(微信小程序之五:登录篇)