1. 程式人生 > >OAuth授權登錄

OAuth授權登錄

acc 提供商 發送 要求 麻煩 登錄頁面 微信授權 重新 獲得

一、寫在前面

日常生活中,我們經常看到到一個網站時,需要登錄的時候,都提供了第三方的登錄,也就是說你可以使用你的微信,QQ,微博等賬號進行授權登錄。那麽這個認證登錄的東西到底是什麽呢?

技術分享圖片

微信授權登錄頁面

或者說你實現這樣的授權登錄,該怎麽做呢?我覺得思路: 首先是登錄的網站時,去在第三方登錄後,第三方回調登錄網站的接口,然後網站這邊拿到第三方的已經登錄狀態,就可以在網站本身登錄了。就相當於微博微信就是你的登錄用戶名和密碼的校驗。

二、OAuth授權登錄

解決上面的問題,就能用到OAUTH協議。

1)【是什麽】:


OAUTH協議為用戶資源的授權提供了一個安全的、開放而又簡易的標準。與以往的授權方式不同之處是OAUTH的授權不會使第三方觸及到用戶的帳號信息(如用戶名與密碼),即第三方無需使用用戶的用戶名與密碼就可以申請獲得該用戶資源的授權,因此OAUTH是安全的。oAuth是Open Authorization的簡寫。現在OAuth已經到2.0版本了。兩者不兼容。OAuth2.0是OAuth協議的下一版本,但不向後兼容OAuth 1.0即完全廢止了OAuth1.0。現在SNS網站對兩個協議的支持情況如下:

技術分享圖片

各網站對OAuth版本支持情況

2)【使用場景】


== 如果一個用戶需要兩項服務:一項服務是圖片在線存儲服務A,另一個是圖片在線打印服務B。

由於服務A與服務B是由兩家不同的服務提供商提供的,所以用戶在這兩家服務提供商的網站上各自註冊了兩個用戶,假設這兩個用戶名各不相同,密碼也各不相同。當用戶要使用服務B打印存儲在服務A上的圖片時,用戶該如何處理?法一:用戶可能先將待打印的圖片從服務A上下載下來並上傳到服務B上打印,這種方式安全但處理比較繁瑣,效率低下;法二:用戶將在服務A上註冊的用戶名與密碼提供給服務B,服務B使用用戶的帳號再去服務A處下載待打印的圖片,這種方式效率是提高了,但是安全性大大降低了,服務B可以使用用戶的用戶名與密碼去服務A上查看甚至篡改用戶的資源。

==用OAUTH實現背景一節中的典型案例:當服務B(打印服務)要訪問用戶的服務A(圖片服務)時,通過OAUTH機制,服務B向服務A請求未經用戶授權的Request Token後,服務A將引導用戶在服務A的網站上登錄,並詢問用戶是否將圖片服務授權給服務B。用戶同意後,服務B就可以訪問用戶在服務A上的圖片服務。整個過程服務B沒有觸及到用戶在服務A的帳號信息。

3)【認證步驟】


==【OAuth 1.0a】

OAuth1認證基本步驟:

獲取未授權的Request Token(temporary credentials)

請求用戶授權Request Token

使用授權後的Request Token換取Access Token(token credentials)

使用 Access Token 訪問或修改受保護資源

技術分享圖片

OAuth1.0流程

==【OAuth 2.0 】

   OAuth2.0和OAuth1.0的區別還是在於簡化了認證過程,不需要從未授權的Request Token轉化到授權Request Token,而是利用app key通過用戶授權生成access token但是,與1.0的不同之處是access token有自身的有效期,且不同平臺、不同級別的程序有著不同的有效期,在程序開發中一定記得判斷access token是否過期,對於過期之後的處理方法主要是利用access token和refresh token重新生成access token或者重新利用app key向服務器發送請求生成access token。由於這個問題,與OAuth1.0基本一致不一樣,各個平臺OAuth2.0做了不一樣的選擇。

  OAuth2.0服務支持以下獲取Access Token的方式:

  a. Authorization Code:Web Server Flow,適用於所有有Server端配合的應用。

  b. Implicit Grant:User-Agent Flow,適用於所有無Server端配合的應用。

  因為demo是無服務器的程式,所以我們采用Implicit Grant:User-Agent Flow的獲取方式。

技術分享圖片

OAuth2.0步驟

4)【國內主要OAuth授權平臺】


==【概述】 國內主要有3種授權登錄形式,分別是微信、QQ和新浪微博。3種平臺授權登錄的流程大同小異,都是需要在其對應的開放網站上註冊應用且產生appid及appsecert(或類似的其它叫法),並利用上述參數按照ahth2方式授權登錄。授權登錄成功後獲取到你的應用相對於授權平臺的唯一標識(微信、QQ叫openid,新浪微博叫uid)。

技術分享圖片

授權流程圖

==【微信】:目前,微信的第三方授權登錄是由微信開放平臺來承載的。根據其最新的文檔,用戶通過微信授權登錄同時用戶授權了獲取userinfo時,則授權成功後會出現unionid字段,即微信開放平臺會同時返回用戶的openid和unionid(移動應用微信登錄開發指南)。開發者只需要將openid和unionid都保存到數據庫即可。

==【QQ】:QQ授權登錄平臺要想保存unionid可能要稍微麻煩一點。需要聯系QQ客服申請獲取unionid的全限。詳見常見問題 - 文檔資料--QQ互聯的問題1。按照其要求發送郵件申請unionid的訪問權限即可。正常情況下QQ客服會很快開通權限並回復開發者的申請郵件,並在郵件中比較詳細的說明調用接口獲取unionid的方式。

技術分享圖片

微博的授權頁面

==【 新浪微博】:新浪比較好,新浪微博的移動App和網頁版的唯一標識都是統一的uid,無需做額外的操作。

三、寫在最後

OAuth協議很有用處,有機會還是自己使用下,這樣才能加深理解和記憶。

OAuth授權登錄