评论

为什么不建议用openid作为登录凭证?

为什么不建议用openid作为登录凭证?

在开发小程序的过程中,登录是一个入口场景,基本每个开发者都会遇到,

那么在开发过程中,我们知道

 既然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来做登录态,用户每隔一段时间都需要进行更新以保障数据的安全性。


最后一次编辑于  2020-01-07  
点赞 5
收藏
评论

19 个评论

  • 阿白
    阿白
    2020-05-26

    用户凭证可以用token机制(如:jwt)

    openid我觉得可以用来做用户唯一标识关联用户id,这样后端就可以根据openid来为小程序进行登录.具体流程如下:

    1.小程序调用wx.login()获取code

    2.调用后端登录接口,将code作为参数传给后端

    3.后端通过code调用微信后端登录接口换取openid

    4.后端通过Openid查询数据库,若查询到用户数据则返回完成登录流程,若查询不到则走注册流程,完成后再返回用户数据

    2020-05-26
    赞同 4
    回复 3
    • 王为民
      王为民
      2023-06-07
      正解
      2023-06-07
      回复
    • 卡布达
      卡布达
      2024-03-05
      佬,请问注册如何获取微信用户信息擦插入到表呢?还有就是如果openid泄露了,改都没法改,该如何解决
      2024-03-05
      回复
    • 阿白
      阿白
      2024-03-08回复卡布达
      注册信息是指 头像 昵称那些? 如果是 那这些应该是在你用openid在用户表生成一条记录后  用户进入小程序自己通过编辑个人信息页面去更新,  如果怕openid泄露 那可以对其进行加密处理
      2024-03-08
      回复
  • -
    -
    2020-03-23

    大神们问个问题哈,刚开始学微信小程序开发

    1 既然openid不安全不能放在小程序里缓存,也不能放在请求里面,使用第三方的sessionkey,这样可以保证安全,而且会有过期时间。 这一点能理解

    但是,有以下不太明白,

    第一 现在很多小程序都只是让咱授权一下,之后好像就没有在授权了,咱们哪天想用就可以打开这个小程序,直接就能用,好像没有过期再重新授权的操作。

    第二 比如有的小程序有个绑定界面,输入用户名密码的后就可以绑定自己的微信号了,下次再登录的时候,也不需要验证用户名和密码了。

    以上两种情况,如果使用第三方的session还是会过期,如果自己的服务器端给每个人分配一个随机字符串,然后小程序再用这个随机字符串去请求,很长时间后,再请求还是从缓存中用这个随机数请求,如果用户表里能匹配上这个随机数就认可能登录,这样效果是不是又和openid一样了,没有过期?

    对于用户名密码绑定微信号你们都是怎么解决的?

    2020-03-23
    赞同 1
    回复 2
    • 小肥羊🍊
      小肥羊🍊
      2020-03-23
      你加我下vx,具体深入聊下吧
      2020-03-23
      回复
    • -
      -
      2020-03-23回复小肥羊🍊
      突然想了下,既然openid是不变的,那我第一次绑定后,以后session过期后再拿code去交换下取openid 再和数据库的一比较,相同的话,就算登录,重新下发个第三方的session不就可以了吗?我这样理解对不?
      2020-03-23
      回复
  • rollback
    rollback
    2019-12-24

    首先,【同一个小程序下的不同微信用户的openid是不一样的】;

    其次,文章中提到的,你用手机A登录小程序A,之后,你一个朋友用手机A登录他自己的微信,他如果没有使用过小程序A的话,这个时候,小程序A是不会在这个微信的小程序列表的;如果这个时候他搜索小程序A,并打开,这个时候一定会让他去登录的,所以不会存在【登录小程序的时候检测到openid已经存在,所以不会再走登录过程】这中情况,即使你把登录状态存在缓存中,但是缓存并非跟着手机走的。

    2019-12-24
    赞同 9
    回复
  • 祺爸💎
    祺爸💎
    2019-12-23

    明天有个朋友想用我的手机登一下微信

    这个时候openid已经换了

    2019-12-23
    赞同 4
    回复 1
    • 小肥羊🍊
      小肥羊🍊
      2019-12-23
      不会呀
      2019-12-23
      回复
  • 郑旭东
    郑旭东
    2019-12-24

    因为用openid做凭证,如果黑客从某些途径得到了某人的openid,可以拿着这个openid去请求你的服务接口,从而拿到数据。用第三方session做凭证,session是会刷新的吧,即使黑客拿到session,也只能用一段时间就失效了。好吧,我也不是专业后端开发,session了解不深入。


    我是怎么做的呢,我用小程序的云开发的云函数,云函数会自动返回给我们一个经过鉴权的openid,这个openid可以确保是本人在访问,就没有安全问题了。

    2019-12-24
    赞同 3
    回复 10
    • 郑旭东
      郑旭东
      2019-12-24
      可能没说清楚,我再补充一下,直接说结论:不要把openid放在客户端,也就是小程序端使用,举个栗子:小程序端发起一个请求,参数里带一个openid,服务接口根据这个openid直接查询数据就返回了,这样是不安全的。云函数里用环境里自动提供的openid是安全的。你的登录凭证跟这些逻辑相关对吧?
      2019-12-24
      回复
    • 离忧.Leo
      离忧.Leo
      2020-03-05回复郑旭东
      为何云函数返回的openid就是安全的那?
      2020-03-05
      回复
    • 郑旭东
      郑旭东
      2020-03-05回复离忧.Leo
      首先这是腾讯框架(也就是云函数)给你的,腾讯保证其正确性,其次这是个服务端数据,不会被轻易篡改
      2020-03-05
      回复
    • 郑旭东
      郑旭东
      2020-03-05
      这里说的返回,就是拿到的意思,不是说返回到客户端使用的意思,是直接在服务端(也就是云函数)逻辑里使用。一旦返回到客户端,一样不安全。
      2020-03-05
      回复
    • 离忧.Leo
      离忧.Leo
      2020-03-05回复郑旭东
      哦哦,谢谢,您帮我看看,我之前的思路是不是不行:
      用云开发做登录:
      首次使用授权——调用云函数,拿到openid,返回到小程序端,缓存到小程序段本地——下次登录时,从缓存中读取openid
       
      我是不是不应该把云函数读取到的openid返回给小程序端,而是在用到openid做查询条件的地方,调动云函数,在云函数里用openid做为查询条件查询数据
      比如我要查询当前使用用户发布过的信息
      2020-03-05
      回复
    查看更多(5)
  • L
    L
    2019-12-24

    1.同一个小程序下的不同微信用户的openid是不一样的

    2.同一个公众号下的不同微信用户的openid是不一样的

    3.同一个开放平台下的不同应用下的同一个用户的unionid是一样的

    4.关于登录凭证,简单来说就是通过用户的唯一标识去服务端获取用户信息。用什么去获取,方便,唯一,安全即可。

    5.session_key的用处:

    1)微信为了确保用户信息不会直接被应用直接调用api获取到,在获取用户信息或手机号时需要应用开发者提供显性授权;

    2)用户的私密信息在用户显性授权之后,微信会将加密后的信息返回给开发者,开发者通过sessionkey,encryptedData,iv,解密用户信息获取显性授权获取到的用户信息,比如手机号,unionid。

    2019-12-24
    赞同 2
    回复 2
    • 小肥羊🍊
      小肥羊🍊
      2019-12-24
      非常感谢,我理解下。
      2019-12-24
      回复
    • 影猪
      影猪
      2021-08-23
      哪怕有一个接口是纯客户端拼接了openid的, 恶意用户就可以在取得了openid的情况下, 直接模拟该接口调用服务端(非微信环境). 并完成后续交互
      2021-08-23
      回复
  • Mr.Zhao
    Mr.Zhao
    2019-12-23

    如果用openid作为登录凭证,登录小程序的时候检测到openid已经存在 我不太理解,这文章太水了

    2019-12-23
    赞同 1
    回复 6
    • 小肥羊🍊
      小肥羊🍊
      2019-12-23
      能帮我解释下,为什么不能用openid作为登录凭证 吗,虚心请教
      2019-12-23
      回复
    • Mr.Zhao
      Mr.Zhao
      2019-12-23回复小肥羊🍊
      但是你说"下面这个例子,顿时豁然开朗",  你已经豁然开朗, 该是明白人了,为什么会越权呢
      2019-12-23
      回复
    • 小肥羊🍊
      小肥羊🍊
      2019-12-23回复Mr.Zhao
      只能说这个例子解释的过去,但是不是被大佬推翻了吗?我想请下,您对这块怎么理解的?
      2019-12-23
      回复
    • Mr.Zhao
      Mr.Zhao
      2019-12-23回复小肥羊🍊
      我做项目简单, 能实现功能, 代码清晰有条理,没BUG就行.  没什么理解
      2019-12-23
      回复
    • Mr.Zhao
      Mr.Zhao
      2019-12-23回复小肥羊🍊
      https://developers.weixin.qq.com/community/develop/doc/0002a028214de86e94079941551800  看一下这个二楼说的
      2019-12-23
      1
      回复
    查看更多(1)
  • 大侠大侠
    大侠大侠
    2019-12-23

    据我所知微信不同账号数据不会共享的,比如wx.setStorageSync和wx.setStorage



    2019-12-23
    赞同 1
    回复
  • Alpha
    Alpha
    2024-12-07

    你这逻辑不是扯淡呢吗,你朋友拿你手机登他的微信,再去访问小程序能访问到你的小程序数据?小程序是跟着微信帐号走的又不是跟着手机走的,他都登陆他账号了,自然访问任何小程序都是用他的账号访问的

    2024-12-07
    赞同
    回复
  • 十一
    十一
    2023-05-27

    这相当于sessionid存在浏览器的cookie里,如果暴露一样就像小偷偷了你的钥匙而且知道你家。如果不是特别注意安全方面的系统,可以直接客户端存openid,不过在做敏感操作时期验证,重新授权(无感)拿到临时code 传到后端去请腾讯的api从而拿到openid 和你客户端的比对,不是你当前的微信的话openid是不一样的(这样多次请求第三方的接口,性能有些问题)。安全些的那就需要把openid作为用户的标识存在token里,就是token令牌,或者用jwt方案,有过期时间如果token被盗用,有时效性,过期就不能用了,如果篡改,服务端验签不通过。就是拿到openid 你还是需要令牌去走完流程才能操作api。就好比你拿到别人身份证,你就能冒充他人了吗,简单的看脸像不像,重点的话验证dna库

    2023-05-27
    赞同
    回复

正在加载...

登录 后发表内容