tencentyun / wafer2-startup

Wafer - 腾讯云下一代小程序综合解决方案
1.02k stars 225 forks source link

wafer2-startup demo 问题 #132

Closed zhaokun78 closed 6 years ago

zhaokun78 commented 6 years ago

研究最新的 demo ,发现一些问题: (1)index.js 第93 行 wx.checkSession,我觉得是没有效果的,证据就是首先点击“登录”成功登录后,再立即点击下方的“清除登录会话”按钮,然后再点“登录”,此时 wx.checkSession 本应返回 fail,可实际上返回的始终是 success

(2)index.js 第 167 行 login: true,按我的理解,根据接口调整公告:“为优化用户体验,使用 wx.getUserInfo 接口直接弹出授权框的开发方式将逐步不再支持。”,如果 167 行 login 设为 true,那么最终还是会调用 wx.getUserInfo,demo 这么做,岂不是与接口调整相矛盾吗?

(3)尝试将第 167 行 login 设为 false,再运行 demo。首先按(1)所述点击“登录”—“清除登录会话”—-“登录”,可以想象,此时提示的登录成功是假的;此时再点击“请求”进行验证,可以看到此时程序报错: Cannot read property 'skey' of null;at pages/index/index page doRequest function

(4)综上所述,既然 wx.checkSession 是没有效果的,那么就把它注释掉,让每一次点击“登录”都真的去登录。于是修改 bindGetUserInfo,将 wx.checkSession 部分代码注释掉,只保留如下代码: qcloud.clearSession(); // 登录态已过期,需重新登录 var options = { encryptedData: e.detail.encryptedData, iv: e.detail.iv, userInfo: userInfo } that.getWxLogin(options);

(5)新的问题出现了,这样修改后在模拟器中按照反复点击“登录—请求”的次序多次测试都是没有问题的,可是当进行真机远程调试时,第一次点击登录按钮时报错: ERR_IN_DECRYPT_DATA Error: error:06065064:digital envelope routines:EVP_DecryptFinal_ex:bad decrypt 再次点击登录按钮则不再报错,一切恢复正常

(6)总结一下: (6-1)我觉得 wx.checkSession() 是没有效果的 (6-2)index.js 第 167 行, login 参数设为 true,我认为这与接口调整所传达的信息不相符。此参数是否将继续保留,需要给一个结论 (6-3)真机中运行时报的 ERR_IN_DECRYPT_DATA 错是什么原因,为何仅第一次报错,如何解决?

jas0ncn commented 6 years ago

你好,你说的 index.js 是哪个文件?

90arther commented 6 years ago

@zhaokun78 ERR_IN_DECRYPT_DATA这个解密错误,似乎是由过期seesion_key造成的,说来也奇怪:

  1. 客户端 wx.login拿到code
  2. 客户端wx.getUserInfo(改用button形式)拿到iv\encryptData
  3. 服务端用code换取session_key
  4. 服务端用session_key\iv\encryptData解密

这个过程似乎很正常,但是每五到十分钟调用一次,能稳定复现解密失败的问题,问题在于session_key未过期的情况下,第三部用新的code换取到的session_key似乎是无效的,导致第四步解密失败。 解决方法就是通过checkSession结果来判断是否需要重新换取新的session_key

zhaokun78 commented 6 years ago

@jas0ncn wafer2-startup/client/pages/index/index.js,是指这个

zhaokun78 commented 6 years ago

@90arther 谢谢关注。但目前,就拿 wafer2-startup demo 来说,checkSession() 其实是不生效的。把 demo 跑起来,点击“登录”---“清除登录会话”---“登录”,此时提示的“登录成功”是代码第 97 行提示的,也就是这一部分代码: wx.checkSession({ success: function () { // 登录态未过期 showSuccess('登录成功'); console.log('登录成功', userInfo); }, 可见, checkSession() 是无效的

zhaokun78 commented 6 years ago

@90arther 或者,换句话说,点击“清除登录会话”按钮时调用的 clearSession() 方法是无效的

zhaokun78 commented 6 years ago

@jas0ncn 能否协助解决一下?

zhaokun78 commented 6 years ago

腾讯改这个登录机制吧,出了问题就不管了,还想让人继续开发小程序吗?

jas0ncn commented 6 years ago

这个问题我们正在处理,可能需要修改后端的 SDK,所以在评估问题

jas0ncn commented 6 years ago

更新了相关实现,可以参考:https://github.com/tencentyun/wafer2-quickstart/issues/10

zhaokun78 commented 6 years ago

client/vendor/wafer2-client-sdk/lib/request.js 第 77 行:if (requireLogin) { 感觉不太对吧?

jas0ncn commented 6 years ago

你说的不太对是什么意思?

zhaokun78 commented 6 years ago

你把 client/pages/index/index.js 第 115 行:login: true 设为 false 看看 client/vendor/wafer2-client-sdk/lib/request.js 第 78 行:var session = Session.get() 应该是必须要检查的,不应该是只有 login 为 true 时才检查的

jas0ncn commented 6 years ago

login 的意思是是否带登录态,如果 false 就不带了,header 就不需要 skey

zhaokun78 commented 6 years ago

对于 login 参数的理解,结合文档的说明,我的理解并不是“login 的意思是是否带登录态,如果 false 就不带了”,文档:https://github.com/tencentyun/wafer2-client-sdk/blob/master/README.md#request 中对 login 参数的说明是:”是否自动登录以获取会话,默认为 false“,说明如果为 false,代表当有会话时则使用当前会话而不登录,如果没有会话则会报错。 况且这才应该是 qcloud.request 存在的意义,qcloud.request 方法的作用就是让请求带会话,这也是和 wx.request 的区别。

jas0ncn commented 6 years ago

感谢建议!已修正回原来逻辑:https://github.com/tencentyun/wafer2-startup/commit/8bac628150824d1060542e1929928b93286d2b3c