爬蟲模擬登錄—OAUTH的詳解

作者:xiaoyu

微信公眾號:Python數據科學


  • 解讀爬蟲中HTTP的秘密(基礎篇)
  • 解讀爬蟲中HTTP的秘密(高階篇)
  • Python爬蟲實戰之(四)| 模擬登錄京東商城

前兩篇分享了HTTP的基本概念和高級用法,以及京東模擬登錄的實戰內容。本篇博主將會繼續與大家分享HTTP中的另一個有趣內容:OAUTH,它也是在爬蟲的模擬登錄中可能會用到的,下面給大家詳細介紹一下。

OAUTH的定義

引自百度百科的定義:

OAUTH協議為用戶資源的授權提供了一個安全的、開放而又簡易的標準。與以往的授權方式不同之處是OAUTH的授權不會使第三方觸及到用戶的帳號信息(如用戶名與密碼),即第三方無需使用用戶的用戶名與密碼就可以申請獲得該用戶資源的授權,因此OAUTH是安全的。oAuth是Open Authorization的簡寫。

目前,最新的OAUTH協議使用2.0版本,具體內容被記錄在RFC6749標準中,可參考鏈接:https://tools.ietf.org/html/r...。

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)

上面提到的微博使用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數據科學,讓一切用數據說話。


推薦閱讀:

beautifulsoup+json抓取stackoverflow實戰
三天學會用python進行簡單地爬取B站網頁視頻數據(一)
出門旅行沒規劃?python抓取馬蜂窩自由行攻略!
使用requests+beautifulsoup爬取你想要的數據
還在找遠控?來看我用十幾行python代碼寫個簡易遠程控制

TAG:python爬蟲 | OAuth20 |