解读爬虫中HTTP的秘密(基础篇) 解读爬虫中HTTP的秘密(高阶篇) Python爬虫之模拟登录京东商城
前两篇分享了HTTP的基本概念和高级用法,以及京东模拟登录
的实战内容。本篇博主将会继续与大家分享HTTP中的另一个有趣内容:OAUTH
,它也是在爬虫的模拟登录中可能会用到的,下面给大家详细介绍一下。
引自百度百科
的定义:
OAUTH协议为用户资源的授权提供了一个安全的、开放而又简易的标准。与以往的授权方式不同之处是OAUTH的授权不会使第三方触及到用户的帐号信息(如用户名与密码),即第三方无需使用用户的用户名与密码就可以申请获得该用户资源的授权,因此OAUTH是安全的。oAuth是Open Authorization的简写。
目前,最新的OAUTH协议使用2.0版本,具体内容被记录在RFC6749
标准中,可参考链接:https://tools.ietf.org/html/rfc6749。
一个简单而不陌生的例子。
我们平时访问某个网站或论坛,如果进行一些个人操作(比如留言),网页一般会弹出让我们先登录的提示。如果这时候我没有账号又不想注册的话,该怎么办呢?我们通常会点击一个第三方的小图标(比如微信)而完成登录。有些网站甚至没有用户注册的功能,完全依靠第三方网站登录获取用户信息。
比如我们使用微博账号
来登录segmentfault
网站。
网页会首先被重定向到微博
的登录界面进行登录,我们输入我们的账号和密码后,segementfault
网站会根据从微博账号获取的信息(比如你的微博头像、昵称、好友列表等)来创建一个用户。当然,segmentfault是不会知道你的微博密码的,因为我们必须保证用户登录信息的安全性而不能将密码明文出去。这一系列的安全性的授权操作都源于使用了OAUTH协议
。
其实在这一过程中,OAUTH协议
解决了传统第三方登录方法的一些弊端,比如:
用户名称
和密码
进行第三方登录的行为,而是通过token
的形式使登录过程更安全可靠。也正是基于这些,OAUTH
就应运而生了。那么,上述的第三方授权登录过程到底是怎么实现的呢?这一过程怎么进行的呢?我们带着这些问题继续往下看。
通过上面应用的介绍,我们不难发现这其中可大概分为三个对象,分别是:
清楚这个之后,我们看看OAUTH
授权的大概思路。
OAUTH
协议,客户端不会与第三方登录网站直接联系,而是先通过一个授权的中间层来建立联系(有的网站将授权服务器和资源服务器分开使用,有的一起使用)。在这个授权层
下,用户密码等安全信息不会泄露给客户端,而是通过反馈一个临时的令牌token
来代替用户信息完成授权。token
相当于一把钥匙
,并且区别于用户密码,token
令牌是经过加密算法生成的,一般的很难破解。token
令牌的权限范围和有效期,以适度的开放资源。token
,并根据用户规定的权限范围和有效期来规矩的获取资源信息。这只是一个大体的思路,说白了就是通过一个授权层隔离了客户端
与用户信息
,并在授权层基础上使用了一把安全的钥匙
来代替用户完成授权。
基于这个思路,RFC6749标准规定了四种不同的授权流程供选择,分别是:
上面提到的微博web网站
使用OAUTH2.0授权码模式
完成授权。其它客户端进行第三方登录之前,需要先在微博开放平台上注册一个应用,在应用里填写信息。注册完后,开放平台会给客户端(比如上面提到的segmentfault
)颁发一个client_id
和一个APP Secret
,供授权请求使用。
下面将详细介绍微博的授权流程,即授权码模式
,其它模式可以参考官方文档:https://tools.ietf.org/html/rfc6749。
下面是OAUTH2.0
协议的详细流程图:
博主以上面segmentfault
通过微博第三方登录为例来详细说明OAUTH
授权流程。
<1> 第一步
首先用户点击微博图标进行第三方登录,然后页面跳转到微博登录界面等待用户输入账号密码授权。
登录界面url如下:
https://api.weibo.com/oauth2/authorize?
client_id=1742025894&
redirect_uri=https%3A%2F%2Fsegmentfault.com%2Fuser%2Foauth%2Fweibo&
scope=follow_app_official_microblog
客服端通过application/x-www-form-urlencoded
格式并使用 UTF8编码 将下列参数加入到 query string
中来建立URI请求。
<2> 第二步
页面跳转到上一步骤的redirect_uri
地址并在末尾添加一个授权码code
值,在后面步骤中会用code
值来换取token
。
跳转地址如下:
https://segmentfault.com/user/oauth/weibo?
code=e7ec7daeb7bbf8cb9d622152cd449ae0
这也验证了reponse_type
是code
类型的正确性。
<3> 第三步
segmentfault
客户端使用授权的code
来获得钥匙token
。
获取token可以通过对微博OAuth2的access_token接口
进行POST请求完成,请求链接如下:
https://api.weibo.com/oauth2/access_token
当然,请求还需要携带以下参数才行。
<4> 第四步
返回上步请求获得的token信息。一个实例结果如下:
{
"access_token": "ACCESS_TOKEN",
"expires_in": 1234,
"remind_in":"798114",
"uid":"12341234"
}
参数说明:
<5> 第五步
使用上一步获得的token获取用户的名称头像等信息。可以通过请求如下链接:
https://api.weibo.com/2/users/show.json
同时请求需要携带以上获取的token和 uid参数。
<6> 第六步
返回获取的用户名称头像等已授权信息。
以上就是整个微博OAUTH授权流程的详细介绍。
本篇介绍了OAUTH的基本概念,并以微博第三方登录授权为例详细了OAUTH的授权码工作流程。
博主会在后续跟进一个爬虫模拟登录微博的实例来深入理解OAUTH
流程,敬请期待!
参考链接:
http://open.weibo.com/wiki/OAuth2/access_token
https://tools.ietf.org/html/rfc6749#section-3.2.1
http://www.ruanyifeng.com/blog/2014/05/oauth_2_0.html