在开发小程序的过程中,登录是一个入口场景,基本每个开发者都会遇到,
那么在开发过程中,我们知道
既然openid是唯一的,那我为什么不能用openid作为凭证,还要麻烦的用个第三方session
其实我之前也一直不明白,今天看了下面这个例子,顿时豁然开朗
有可能造成数据越权。
比如今天我通过我的手机登录了微信,打开了小程序。但是明天有个朋友想用我的手机登一下微信。如果用openid作为登录凭证,登录小程序的时候检测到openid已经存在,所以不会再走登录过程,这样我的数据就让我的朋友看到了。所以还是要按照官方推荐的步骤来。
### 20191224
https://developers.weixin.qq.com/community/develop/doc/0002a028214de86e94079941551800
小明同学很稀罕同桌小花,有天看到小花在某个微信公众号写日记,好巧,猥琐的小明看到并记住了小花的开屏密码。等课间小花同学出去时,将她手机开机并打开了那个公众号,进入了个人中心。
哎呀,时间不够看呀,于是选择了用浏览器打开看到了URL。
你说巧不巧,这个站竟然在URL里有个openid的传值,没有登陆鉴权。
小明用他无比迅捷的手速把url发给了自己的号,还不着痕迹地打扫了战场。
以后的日子里,小明时刻都能通过点击那个url翻看小花的日记,真是爽煞,发起了向女神攻心的神级技能。
### 20200107
更新:下面这个文章有说明为什么不用openid作为登录态
https://developers.weixin.qq.com/community/develop/doc/000c2424654c40bd9c960e71e5b009
Q2: 既然用户的openId是永远不变的,那么开发者可以使用openId作为用户的登录态么?
A:行,这是非常危险的行为。因为openId是不变的,如果有坏人拿着别人的openId来进行请求,那么就会出现冒充的情况。所以我们建议开发者可以自己在后台生成一个拥有有效期的第三方session来做登录态,用户每隔一段时间都需要进行更新以保障数据的安全性。
用户凭证可以用token机制(如:jwt)
openid我觉得可以用来做用户唯一标识关联用户id,这样后端就可以根据openid来为小程序进行登录.具体流程如下:
1.小程序调用wx.login()获取code
2.调用后端登录接口,将code作为参数传给后端
3.后端通过code调用微信后端登录接口换取openid
4.后端通过Openid查询数据库,若查询到用户数据则返回完成登录流程,若查询不到则走注册流程,完成后再返回用户数据
大神们问个问题哈,刚开始学微信小程序开发
1 既然openid不安全不能放在小程序里缓存,也不能放在请求里面,使用第三方的sessionkey,这样可以保证安全,而且会有过期时间。 这一点能理解
但是,有以下不太明白,
第一 现在很多小程序都只是让咱授权一下,之后好像就没有在授权了,咱们哪天想用就可以打开这个小程序,直接就能用,好像没有过期再重新授权的操作。
第二 比如有的小程序有个绑定界面,输入用户名密码的后就可以绑定自己的微信号了,下次再登录的时候,也不需要验证用户名和密码了。
以上两种情况,如果使用第三方的session还是会过期,如果自己的服务器端给每个人分配一个随机字符串,然后小程序再用这个随机字符串去请求,很长时间后,再请求还是从缓存中用这个随机数请求,如果用户表里能匹配上这个随机数就认可能登录,这样效果是不是又和openid一样了,没有过期?
对于用户名密码绑定微信号你们都是怎么解决的?
首先,【同一个小程序下的不同微信用户的openid是不一样的】;
其次,文章中提到的,你用手机A登录小程序A,之后,你一个朋友用手机A登录他自己的微信,他如果没有使用过小程序A的话,这个时候,小程序A是不会在这个微信的小程序列表的;如果这个时候他搜索小程序A,并打开,这个时候一定会让他去登录的,所以不会存在【登录小程序的时候检测到openid已经存在,所以不会再走登录过程】这中情况,即使你把登录状态存在缓存中,但是缓存并非跟着手机走的。
明天有个朋友想用我的手机登一下微信
这个时候openid已经换了
因为用openid做凭证,如果黑客从某些途径得到了某人的openid,可以拿着这个openid去请求你的服务接口,从而拿到数据。用第三方session做凭证,session是会刷新的吧,即使黑客拿到session,也只能用一段时间就失效了。好吧,我也不是专业后端开发,session了解不深入。
我是怎么做的呢,我用小程序的云开发的云函数,云函数会自动返回给我们一个经过鉴权的openid,这个openid可以确保是本人在访问,就没有安全问题了。
用云开发做登录:
首次使用授权——调用云函数,拿到openid,返回到小程序端,缓存到小程序段本地——下次登录时,从缓存中读取openid
我是不是不应该把云函数读取到的openid返回给小程序端,而是在用到openid做查询条件的地方,调动云函数,在云函数里用openid做为查询条件查询数据
比如我要查询当前使用用户发布过的信息
1.同一个小程序下的不同微信用户的openid是不一样的
2.同一个公众号下的不同微信用户的openid是不一样的
3.同一个开放平台下的不同应用下的同一个用户的unionid是一样的
4.关于登录凭证,简单来说就是通过用户的唯一标识去服务端获取用户信息。用什么去获取,方便,唯一,安全即可。
5.session_key的用处:
1)微信为了确保用户信息不会直接被应用直接调用api获取到,在获取用户信息或手机号时需要应用开发者提供显性授权;
2)用户的私密信息在用户显性授权之后,微信会将加密后的信息返回给开发者,开发者通过sessionkey,encryptedData,iv,解密用户信息获取显性授权获取到的用户信息,比如手机号,unionid。
如果用openid作为登录凭证,登录小程序的时候检测到openid已经存在 我不太理解,这文章太水了
据我所知微信不同账号数据不会共享的,比如wx.setStorageSync和wx.setStorage
你这逻辑不是扯淡呢吗,你朋友拿你手机登他的微信,再去访问小程序能访问到你的小程序数据?小程序是跟着微信帐号走的又不是跟着手机走的,他都登陆他账号了,自然访问任何小程序都是用他的账号访问的
这相当于sessionid存在浏览器的cookie里,如果暴露一样就像小偷偷了你的钥匙而且知道你家。如果不是特别注意安全方面的系统,可以直接客户端存openid,不过在做敏感操作时期验证,重新授权(无感)拿到临时code 传到后端去请腾讯的api从而拿到openid 和你客户端的比对,不是你当前的微信的话openid是不一样的(这样多次请求第三方的接口,性能有些问题)。安全些的那就需要把openid作为用户的标识存在token里,就是token令牌,或者用jwt方案,有过期时间如果token被盗用,有时效性,过期就不能用了,如果篡改,服务端验签不通过。就是拿到openid 你还是需要令牌去走完流程才能操作api。就好比你拿到别人身份证,你就能冒充他人了吗,简单的看脸像不像,重点的话验证dna库