专栏首页Python数据科学爬虫模拟登录—OAUTH的详解

爬虫模拟登录—OAUTH的详解

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

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

OAUTH的定义

引自百度百科的定义:

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

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

OAUTH的应用

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

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

比如我们使用微博账号来登录segmentfault网站。

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

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

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

也正是基于这些,OAUTH就应运而生了。那么,上述的第三方授权登录过程到底是怎么实现的呢?这一过程怎么进行的呢?我们带着这些问题继续往下看。

OAUTH实现的思路

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

  • 客户端(上面的segmentfault)
  • 第三方(上面的weibo)
  • 用户(我们自己)。

清楚这个之后,我们看看OAUTH授权的大概思路。

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

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

OAUTH的运行流程

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

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

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

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

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/access_token

当然,请求还需要携带以下参数才行。

  • 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_in:access_token的生命周期,单位是秒数。
  • remind_in:access_token的生命周期。
  • uid:授权用户的UID,本字段只是为了方便开发者,减少一次user/show接口调用而返回的,第三方应用不能用此字段作为用户登录状态的识别,只有access_token才是用户授权的唯一票据。

<5> 第五步

使用上一步获得的token获取用户的名称头像等信息。可以通过请求如下链接:

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

同时请求需要携带以上获取的token和 uid参数。

<6> 第六步

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

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

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

本文分享自微信公众号 - Python数据科学(Python_Spiderman),作者:Python爬虫之路

原文出处及转载信息见文内详细说明,如有侵权,请联系 yunjia_community@tencent.com 删除。

原始发表时间:2018-02-15

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • 通过 Python 理解 Mixin 概念

    Mixin 即 Mix-in,常被译为“混入”,是一种编程模式,在 Python 等面向对象语言中,通常它是实现了某种功能单元的类,用于被其他子类继承,将功能组...

    用户2769421
  • 手把手教你用 Python 实现一个 RPC 框架

    本文将会使用Python实现一个最简单的RPC框架,玩具向,不具有实用意义,但可以让你清醒的理解RPC框架的几个组成部分,只是比看Python自带的xmlrpc...

    用户2769421
  • Python爬虫之模拟登录wechat

    不知何时,微信已经成为我们不可缺少的一部分了,我们的社交圈、关注的新闻或是公众号、还有个人信息或是隐私都被绑定在了一起。既然它这么重要,如果我们可以利用爬虫模拟...

    用户2769421
  • Linux登录那点事

    跨平台系列汇总:http://www.cnblogs.com/dunitian/p/4822808.html#linux 我们登录linux的时候基本上不太关注...

    逸鹏
  • Android技巧2:登录注册解决方案

    用户1130025
  • 安装记录:NAT123实现端口映射,SSH登陆内网主机

    若提示没有mono-complete,使用mono-devel或monoDevelop或monodevelop

    csxiaoyao
  • 一个少有人知的导致 SSH 登录缓慢的原因

    这是 PAM 的 last_log 模块的输出,这个数据统计的是上次成功登录之后,有多少次失败登录的尝试。这些失败尝试主要来源于网上各种扫描器,统计数据来源于文...

    horsley
  • Taro 小程序开发大型实战(九):使用 Authing 打造拥有微信登录的企业级用户系统

    乍一看这个博客有点小完整了,但是一路跟下来的同学应该知道,我们之前的登录都是通过传入用户的 nickName 和 photo 来登录的,但是我们一般在生活中看到...

    一只图雀
  • python模拟登陆Github示例

    输入账号密码,打开开发者工具,在Network页勾选上Preserve Log(显示持续日志),点击登录,查看Session请求,找到其请求的URL与Form ...

    py3study
  • Xshell 登录 AWS CentOS 出现“所选择的用户秘钥未在远程主机上注册“,最终解决办法!

     其实就是 登录用户名错了,是 root,不是centos 也不是 ec2-user !  Xshell 连接配置界面如下 ? 最重要是 登录授权配置 ?  最...

    庞小明

扫码关注云+社区

领取腾讯云代金券