OAuth2.0学习笔记,实战分析

前言

OAuth 是一个关于授权(authorization)的开放网络标准,在全世界得到广泛应用,目前的版本是 2.0 版,本文对 OAuth2.0 的设计思想和运行流程,做一个简明通俗的解释,主要参考材料 RFC 6749

应用场景

实际系统集成过程中经常会涉及到和第三方应用做集成,于是涉及到一个验权的问题,比如知乎的网站需要访问微信的API服务器获取某个人的个人信息数据,那么问题来了,微信服务器如何给知乎网站授权呢?

传统方案是用户将自己微信的用户名和密码告诉知乎网站,让知乎去登录微信服务器,这样非常麻烦,并且存在诸多问题,如下:

1
2
3
4
1.知乎为了后续更多的业务,会保留微信的用户名和密码,这样存在安全隐患
2.微信必须提供一个接口支持帐号密码方式的登录
3.帐号密码方式登录,很难限权
4.用户如果修改密码,需要同步修改知乎的密码

相关名词介绍

这里先介绍几个和OAuth2.0相关的名词,后面再展开对原理的分析

1
2
3
4
5
6
1.第三方应用-客户端(Third-party application):即上一节例子中的知乎应用
2.服务提供商(HTTP service):即上一节介绍的微信
3.资源所有者-用户(Resource Owner):这里指的我
4.用户代理-浏览器:用户代理
5.认证服务器(Authorization server):即服务提供商专门用来处理认证的服务器
6.资源服务器(Resource server):即服务提供商专门用来存放资源的服务器

知道了这么名词就很容易理解OAuth2.0的原理了

核心思想

OAuth旨在让服务提供商可以给第三方应用授权(以某种形式给第三方应用一个令牌token),让第三方应用不用密码和帐号就可以访问资源服务器上的资源,当令牌失效的时候,服务将停止

原理

2017061612861oauth.png

1
2
3
4
5
6
7
8
9
10
11
(A)用户打开客户端以后,客户端要求用户给予授权。

(B)用户同意给予客户端授权。

(C)客户端使用上一步获得的授权,向认证服务器申请令牌。

(D)认证服务器对客户端进行认证以后,确认无误,同意发放令牌。

(E)客户端使用令牌,向资源服务器申请获取资源。

(F)资源服务器确认令牌无误,同意向客户端开放资源。

OAuth2.0的具体实现形式有许多种,他的核心其实就是服务提供商如何把token信息给用户,并让用户带上token去访问资源服务器的信息

实战分析-虎嗅网网页版微信登录

这里我来分析一下互联网厂商的OAuth2.0对接是如何实现的

虎嗅网的web版支持微信登录,我来抓包分析一下他的OAuth原理

1.我们先打开虎嗅网网页版的微信登录页面,虎嗅会上传他的appid,回调地址,login_type,scope给微信服务端(用一个http长轮询),微信返回提供了一个二维码,希望我们用微信来扫一扫

2017061633317screenshot_70.png

这个二维码是微信提供的,转化为url后格式如下:https://open.weixin.qq.com/connect/confirm?uuid=0817MznOwr0zDxtc,其中uuid是随机生成的

在虎嗅网的web端此刻并启用了第一个http长轮询,用来向微信服务器获取用户是否扫描了该二维码

http长轮询:

https://long.open.weixin.qq.com/connect/l/qrconnect?uuid=021-J5ZWqyQzdaOR&_=1497623274214

2.我们用微信扫一扫

我们用微信的扫一扫,扫描这个二维码,微信发现该url被访问后会在后台生成一条访问记录(猜测某条uuid记录的请求,请求访问微信用户数据),此刻虎嗅网页面第二个长轮询返回response,告诉虎嗅前端,用户已经扫描了二维码,等待确定授权,此刻又发起了第三个长轮询,等待用户点击确认授权按钮

2017061620830screenshot_71.png

https://long.open.weixin.qq.com/connect/l/qrconnect?uuid=051Ipzd2zyr-tEON&last=404&_=1497623631146

3.我们点击确认,授权使用微信帐号

此时虎嗅网前端第三个http长轮询收到授权结果反馈,获取code,带上code,访问虎嗅回调url,在后台获取微信用户信息:https://www.huxiu.com/user_action/oauthCallback/weixin.html?code=041Mzl9l0JC8ao1JJA9l02el9l0Mzl9A&state=

4.重定向到虎嗅首页

回调http请求会在后台获取微信用户信息,并完成用户注册,登陆相关操作,然后返回一个302跳转到虎嗅首页,抓包请求如下:

2017061697212screenshot_69.png

总结:

到此虎嗅网微信授权登录分析完成,虎嗅网web端的微信登录过程中,关键步骤有如下:

1.他的code验证最核心步骤是让用户点击确认按钮

2.然后通过虎嗅url请求回调,在后台获取微信用户信息,并在后台完成注册,登陆相关操作,也完成了授权

3.这里面核心角色是微信(服务提供商,需要提供个人信息和头像照片),虎嗅网(第三方服务,需要微信的信息来完成登录),我(用户,需要操作,确认授权)

4.三个http长轮询,第一次是获取微信登陆二维码,第二次是获取用户是否扫描过二维码,第三次是获取用户是否点击确认按钮

5.http互动过程中每个角色所做的事

微信:

1.提供二维码

2.响应虎嗅前端三次http长轮询

3.验证,导出微信用户数据到虎嗅后台

虎嗅网前端:

1.三次http长轮询,第一次收到二维码然后显示,第二次用户扫描二维码后显示让他点击,第三次用户点击后回调之前的回调地址并附带上code,然后重定向到虎嗅首页

虎嗅网后端:

第三次用户点击确认后,附带code回调访问虎嗅后台,此刻会去微信服务器导用户数据到虎嗅后台,并完成注册相关操作,然后回调回虎嗅首页

我:

1.点击微信登陆

2.扫描二维码

3.点击确认登陆按钮

相关资料

http://www.ruanyifeng.com/blog/2014/05/oauth_2_0.html

坚持原创技术分享,您的支持将鼓励我继续创作!