爬虫模拟登陆—OAUTH的详解

做者:xiaoyu
微信公众号:Python数据科学
知乎:python数据分析师html


解读爬虫中HTTP的秘密(基础篇)
解读爬虫中HTTP的秘密(高阶篇)
Python爬虫之模拟登陆京东商城

前两篇分享了HTTP的基本概念和高级用法,以及京东模拟登陆的实战内容。本篇博主将会继续与你们分享HTTP中的另外一个有趣内容:OAUTH,它也是在爬虫的模拟登陆中可能会用到的,下面给你们详细介绍一下。python

OAUTH的定义


引自百度百科的定义:算法

OAUTH协议为用户资源的受权提供了一个安全的、开放而又简易的标准。与以往的受权方式不一样之处是OAUTH的受权不会使第三方触及到用户的账号信息(如用户名与密码),即第三方无需使用用户的用户名与密码就能够申请得到该用户资源的受权,所以OAUTH是安全的。oAuth是Open Authorization的简写。

目前,最新的OAUTH协议使用2.0版本,具体内容被记录在RFC6749标准中,可参考连接:https://tools.ietf.org/html/r...json

OAUTH的应用


一个简单而不陌生的例子。segmentfault

咱们平时访问某个网站或论坛,若是进行一些我的操做,网页通常会弹出让咱们先登陆的提示。若是这时候我没有帐号又不想注册的话,该怎么办呢?咱们一般会点击一个第三方的小图标(好比微信)而完成登陆。有些网站甚至没有用户注册的功能,彻底依靠第三方网站登陆获取用户信息。api

好比咱们使用微博帐号来登陆segmentfault网站。安全

网页会首先被重定向到微博的登陆界面进行登陆,咱们输入咱们的帐号和密码后,segementfault网站会根据从微博帐号获取的信息(好比你的微博头像、昵称、好友列表等)来建立一个用户。固然,segmentfault是不会知道你的微博密码的,由于咱们必须保证用户登陆信息的安全性而不能将密码明文出去。这一系列的安全性的受权操做都源于使用了OAUTH协议服务器

其实在这一过程当中,OAUTH协议解决了传统第三方登陆方法的一些弊端,好比:微信

  • 避免了传统方法中直接使用用户名称密码进行第三方登陆的行为,而是经过token的形式使登陆过程更安全可靠。
  • 避免了传统方法中修改密码会丧失全部第三方程序受权的尴尬。
  • 避免了因任意一个第三方程序被破解而泄露用户信息的缺点。

也正是机遇这些,OAUTH就应运而生了。那么,上述的第三方受权登陆过程究竟是怎么实现的呢?这一过程怎么进行的呢?咱们带着这些问题继续往下看。app

OAUTH实现的思路


经过上面应用的介绍,咱们不难发现这其中可大概分为三个对象,分别是:

  • 客户端(上面的segmentfault)
  • 第三方(上面的weibo)
  • 用户(咱们本身)。

清楚这个以后,咱们看看OAUTH受权的大概思路。

  • 使用OAUTH协议,客户端不会与第三方登陆网站直接联系,而是先经过一个受权的中间层来创建联系(有的网站将受权服务器和资源服务器分开使用,有的一块儿使用)。在这个受权层下,用户密码等安全信息不会泄露给客户端,而是经过反馈一个临时的令牌token来代替用户信息完成受权。token至关于一把钥匙,而且区别于用户密码,token令牌是通过加密算法生成的,通常的很难破解。
  • 另外,用户能够指定token令牌的权限范围和有效期,以适度的开放资源。
  • 获得受权后,客户端就会带着token,并根据用户规定的权限范围和有效期来规矩的获取资源信息。

这只是一个大致的思路,说白了就是经过一个受权层隔离了客户端用户信息,并在受权层基础上使用了一把安全的钥匙来代替用户完成受权。

OAUTH的运行流程


基于这个思路,RFC6749标准规定了四种不一样的受权流程供选择,分别是:

  • 受权码模式(authorization code)
  • 简化模式(implicit)
  • 密码模式(resource owner password credentials)
  • 客户端模式(client credentials)

上面提到的微博使用OAUTH2.0受权码模式完成受权。其它客户端进行第三方登陆以前,须要先在微博开放平台上注册一个应用,在应用里填写本身的信息。注册完后,开放平台会给客户端(好比上面提到的segmentfault)颁发一个client_id和一个APP Secret,供受权请求的使用。

下面将详细介绍微博的受权流程,即受权码模式,其它模式能够参考官方文档:https://tools.ietf.org/html/r...

OAUTH的详细实现过程


下面是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请求。

  • client_id:即segmentfault在微博开放平台申请的应用ID号(须要)
  • redirect_uri:用户受权后须要跳转到的url地址(可选)
  • scope:用户受权的权限范围和有效期(可选)

<2> 第二步

页面跳转到上一步骤的redirect_uri地址并在末尾添加一个受权码code值,在后面步骤中会用code值来换取token

跳转地址以下:

https://segmentfault.com/user/oauth/weibo?code=e7ec7daeb7bbf8cb9d622152cd449ae0

参数说明:

  • code:受权码,且只能被客户端使用一次,不然会被受权服务器拒绝。该码与上面的应用ID和重定向URI,是一种映射关系。

这也验证了reponse_typecode类型的正确性。

<3> 第三步

segmentfault客户端使用受权的code来得到钥匙token

获取token能够经过对微博OAuth2的access_token接口进行POST请求完成,请求连接:https://api.weibo.com/oauth2/...

固然,请求还须要携带如下参数才行。

  • client_id:申请应用时分配的AppKey
  • client_sceret:申请应用时分配的AppSecret
  • grant_type:请求的类型,填写authorization_code
  • code:调用authorize得到的code
  • redirect_uri:回调地址,需需与注册应用里的回调地址一致

<4> 第四步

返回上步请求得到的token信息。一个实例结果以下:

{
       "access_token": "ACCESS_TOKEN",
       "expires_in": 1234,
       "remind_in":"798114",
       "uid":"12341234"
 }

参数说明:

  • access_token:用户受权的惟一票据,用于调用微博的开放接口,同时也是第三方应用验证微博用户登陆的惟一票据,第三方应用应该用该票据和本身应用内的用户创建惟一影射关系,来识别登陆状态,不能使用本返回值里的UID字段来作登陆识别。
  • expires_inaccess_token的生命周期,单位是秒数。
  • remind_inaccess_token的生命周期。
  • uid:受权用户的UID,本字段只是为了方便开发者,减小一次user/show接口调用而返回的,第三方应用不能用此字段做为用户登陆状态的识别,只有access_token才是用户受权的惟一票据。

<5> 第五步

使用上一步得到的token获取用户的名称头像等信息。能够经过请求以下连接:

https://api.weibo.com/2/users...

同时请求须要携带以上获取的tokenuid参数。

<6> 第六步

返回获取的用户名称头像等已受权信息。

以上就是整个微博OAUTH受权流程的详细介绍。

OAUTH总结


本篇介绍了OAUTH的基本概念,并以微博第三方登陆受权为例详细了OAUTH的受权码工做流程。

博主会在后续跟进一个爬虫模拟登陆微博的实例来深刻理解OAUTH流程,敬请期待!

参考连接:
http://open.weibo.com/wiki/OA...
https://tools.ietf.org/html/r...
http://www.ruanyifeng.com/blo...


关注微信公众号Python数据科学,获取 120G 人工智能 学习资料。

图片描述
图片描述

相关文章
相关标签/搜索