认识微信网页授权
微信网页授权(官方文档)是公众号开发者在微信内嵌浏览器中获取用户基本信息的唯一方式,其最关键的就是取得用户的 openid,进而才能实现支付一类的功能,因此微信这个 OAuth 的意义已经不仅仅在于授权登录了。

一个简单的微信授权的流程大致如下:

当然,在实际使用中,我们不会让用户每次都去授权,授权之后我们会把信息写入 session/cookie 中,于是一个比较标准的流程应该是:


state 该如何用
在微信授权的参数里面,有一个不太起眼的非必须字段 state ,官方的说明是『重定向后会带上state参数,开发者可以填写a-zA-Z0-9的参数值,最多128字节』,咋看一下,似乎只是一个标识字段,用来传递用户授权前的状态。

但实际上,我们可以在回调地址 redirect_uri 里传递任何参数,同样可以用来保持用户的状态,实现和 state 一样的效果,为什么还要单独设立一个 state 参数呢?

在我刚接触微信授权的时候,应业务需求做了一个微信授权的中转服务,我将 state 用来标识用户在授权后应该去到哪一个应用,比如用户需要去我们的商城 mall,那么就传 state=mall。这个设计看似高效合理,但是不知不觉间就已经引入了一个潜在的安全问题了:

如果授权第二步中微信 301 重定向的 url 被其他人截取了,我没有办法验证这个 url 的请求者是不是我的真实用户,因为没有一个字段可以给我用来做验证。只要行动够快或够鸡贼,这个不怀好意的家伙拿着这个 url 便可以跳过微信的授权以用户的身份登录到我们的商城,而且由于 state 设计得过于简单,他甚至可以通过修改 state 去到任何一个接入过的系统。

如果你用过一些主流的微信支持组件,如 ruby 的 wechat gem 包、php 的 EasyWeChat,你会发现他们的授权方法里都不支持自定义 state,授权 callback 的时候会对 state 做比对检测。对此,ruby wechat 的维护者 Eric-Guo 给出的解释是:

state的确可以这么用(自定义使用),但是设计目的实际上是为了安全性,也就是说这个state设计的目的是防止有人冒名顶替的登录。。

这也是wechat gem内置帮你填写的原因,而不是放出来让你自定义的原因。

综上,state 一种比较有效的用法是:

在授权开始前生成并写入用户的 cookie(还需要加密),授权完成时,比对 url 与 cookie 中的 state,如果不一致便可判定为非法请求。

40029 报错如何处理
我相信大部分开发过微信授权的人,都遇到过 40029 这个报错。对于这个报错,官方说明是 『40029 不合法的 oauth_code』,排开真正 code 错误的情况(这种情况几乎可以忽略),通常会遇到这个报错的原因都是同一个 code 被使用了两次。

其实这是微信的一项安全策略,将用户授权的 code 设计为一次性的,从而极大程度的避免了不怀好意的人截取并记录回调 url,然后恶意访问,绕过微信授权实现欺骗登录。上一节中提到这同一个问题时,我用了『只要行动够快或够鸡贼』这个限定,因为只有他赶在用户跳转前请求才能成功的伪装成用户登录,除了快他也可以篡改返回数据包中的 redirect_url 让用户根本就取不到真正的 url,他便可以悠哉悠哉的去操作了。

曾经我为了解决这个 40029 报错的问题,花了不少时间去查看日志,发现大约有下面几种情况有可能会触发 40029:

用户授权跳转后,点击返回触发二次请求。这种情况,要么是你没有记录用户的状态(openid),要么就是用户状态正好丢失了(session 丢失或 cookie 丢失,都是小概率事件)
用户在授权时,网速略慢,等待的时间略微有点久了,于是正好在第一次请求返回前刷新了页面,触发了第二次请求
几乎同时收到两个完全一样的授权回调请求,不排除是某些手机某些版本的微信内置浏览的某些行为导致的
还有一种,用户授权完成,几秒钟后另一个 ip 又来请求了同一个 URL,

微信网页授权关于state相关推荐

  1. android user-agent iso-8859-1,微信网页授权,错误40163,ios正确,安卓错误?

    2018-07-18:一年时间过去了,我又回来填自己挖的坑了!! 2017年7月,我遇到了这个问题,当时在这里提了问,后来又跟踪了两天,也没彻底搞懂,反正时好时坏,,后来自己主要精力放在H5+开发上, ...

  2. ajax 微信code获取_ajax 实现微信网页授权登录的方法

    项目背景 因为项目采用前后端完全分离方案,所以,无法使用常规的微信授权登录作法,需要采用 ajax 实现微信授权登录. 需求分析 因为本人是一个phper ,所以,微信开发采用的是 EasyWeCha ...

  3. 微信网页开发教程 php,PHP实现微信网页授权开发教程,php授权教程_PHP教程

    PHP实现微信网页授权开发教程,php授权教程 微信网页授权是服务号才有的高级功能,开发者可以通过授权后获取用户的基本信息:在此之前,想要获取消息信息只能在用户和公众号交互时根据openid获取用户信 ...

  4. java : 实现微信网页授权,超详细!

    背景 使用微信公众号实现网页授权. 开始 1.微信网页授权的官方文档 微信网页授权 2.申请微信测试公众号 从红框进入申请页面. 填写必要的信息,注意上图红框部分的域名需要可以外网能够访问,微信需要发 ...

  5. PHP如何实现微信网页授权

    微信网页授权是服务号才有的高级功能,开发者可以通过授权后获取用户的基本信息:在此之前,想要获取消息信息只能在用户和公众号交互时根据openid获取用户信息:而微信网页授权可在不需要消息交互,也不需要关 ...

  6. 微信公众号开发(一) 微信网页授权登录

    微信网页授权登录 前期准备 授权登录 获取微信数据 处理授权拒绝 前期准备 1.微信公众号开发,首先要搞一个公众号,开发阶段可以申请一个公众平台测试账号. (进入到微信公众公众平台,找到开发者工具,点 ...

  7. Spring Boot 微信-网页授权获取用户信息

    微信-验证服务器有效性 微信-网页授权获取用户信息 网页授权获取用户信息步骤 第一步:用户同意授权,获取code 第二步:通过code换取网页授权access_token 第三步:拉取用户信息(需sc ...

  8. php微信授权ajax,ajax 实现微信网页授权登录

    项目背景 因为项目采用前后端完全分离方案,所以,无法使用常规的微信授权登录作法,需要采用 ajax 实现微信授权登录. 需求分析 因为本人是一个PHPer ,所以,微信开发采用的是 EasyWeCha ...

  9. php怎么开发微信网页,PHP实现微信网页授权开发的步骤

    这篇文章主要为大家分享了PHP实现微信网页授权开发教程,开发者可以通过授权后获取用户的基本信息,感兴趣的小伙伴们可以参考一下 微信网页授权是服务号才有的高级功能,开发者可以通过授权后获取用户的基本信息 ...

  10. 微信网页授权并获取用户信息

    介绍 在很多微信H5应用里,当用户访问第三方应用时就需要进行微信网页授权,并且很多涉及安全的操作我们必须要先获取用户信息才能继续,本文章简单介绍了微信授权流程,并通过申请微信测试账号来模拟网页授权,用 ...

最新文章

  1. matlab画平行坐标轴的直线
  2. python 给定URL 如何获取其内容,并将其保存至HTML文档。
  3. 类加载过程(加载+验证+准备+解析+初始化)
  4. 如何在树莓派上进行python编程_《树莓派Python编程指南》怎么样_目录_pdf在线阅读 - 课课家教育...
  5. Ubuntu安装MDK
  6. C#中DateTime的缺陷与代替品DateTimeOffset
  7. cognos java api_Cognos API Connection
  8. 编程关键词介绍...
  9. Kali Linux Web 渗透测试秘籍 第二章 侦查
  10. go语言的文件简单的操作
  11. CSS现状和如何学习
  12. 开关电源和LDO的区别
  13. 马尔可夫链预测模型的应用——以安徽各城市人均GDP预测为例
  14. 《面向对象程序设计(Java)》第四周学习总结
  15. surface usb启动_Surface Book 2开发人员印象和USB-C的魔力
  16. IOS开发-画曲线画弧线画圆
  17. 新版标准日本语初级_第四课
  18. 空间面板回归模型(stata操作)
  19. 爬虫爬取快代理网站动态IP
  20. 远程桌面连接不上,三种方法教你重启服务器

热门文章

  1. 高配置服务器组装电脑,小白DIY装机需睁大眼睛!点评几款网购组装电脑主机配置单...
  2. 计算机操作系统-操作系统的定义
  3. GNU Radio系列教程(四):初级篇之GNU Radio GRC采样率
  4. windows下安装sloth
  5. (79)【按键】[独立按键] - 1: 单击,双击,三击以及N击
  6. 数电课程设计数字钟c语言编程,数电数字钟设计,含源码
  7. 2021杭电多校第三场 D题—Game on Plane(思维题)
  8. 「消息秒回」是一种美德
  9. Golang 标准库 tips之waitgroup详解
  10. 冰点还原安装了找不到图标,或许该这样!