最近柯南在研究網路服務認證的方式,
除了較為原始的basic authentication外,
OAuth似乎漸漸成為認證的主流。
現在許多網站紛紛開始支援OAuth這種認證方式,
例如Twitter、Foursquare、Google的GMail與Yahoo的YOS等。


OAuth是Open Authorization的縮寫,
透過這種協定,
使用者可以在不透露帳號密碼的情況下,
授權第三方網路應用服務(在協定中稱為Consumer)使用(或登入)原本的網路服務(在協定稱為Service Provider)。
例如我們可以利用oauth的方式在自己撰寫的網站登入twitter, google, yahoo或foursquare等網站,
並使用其開放出來的網路服務。

長久以來,
柯南一直想搞清楚這一塊,
不過透過搜尋引擎找尋中文資料的結果並不好,
資料不太多,
因此柯南才興起寫這篇文章的想法,
紀錄下一些OAuth的相關作法。

關於OAuth的定義,
英文的資料其實不少,
有興趣的朋友可以參考以下網站:
1. OAuth官方網站 : http://oauth.net/
2. YDN上的OAUTH說明: http://developer.yahoo.com/oauth/guide/oauth-guide.html

首先來看看如果我們要自己開發程式並利用OAuth進行認證,大致的流程有哪些:
(以下流程是根據YDN跟Twitter oauth實作經驗整理出來,若有謬誤或需要補充的地方也歡迎路過此的朋友補充。)
1.我們要向提供OAuth認證服務的網站註冊要使用 OAuth,此時該網站會給我們兩個值Consumer Key跟Consumer secret

2.通常提供OAuth認證服務的網站應該還會提供以下資訊,讓我們進行接下來的操作:
  a) Request token URL
  b) Authorize URL
  c) Access token URL

3.我們的程式要向Request token URL發出取得未獲授權Token的請求,
  在我們發出的請求中,主要要包含以下參數,並以GET(或POST)方式送出

4.此時提供OAuth認證服務的網站會回覆我們以下資訊:

5.有時候OAuth認證服務的網站會提供更多資訊,
例如YAHOO的服務會多提供oauth_expires_in等資訊,請參考這個連結

6.將取回的oauth_token當成parameter,
讓我們的程式帶著這個oauth_token向Authorize URL發出請求。

7.此時OAuth認證服務的網站會讓我們登入該網站並顯示顯示類似下面的訊息,
要求使用者允許我們的程式存取的權限。


8.在使用者允許我們程式的存取權限後,
OAuth認證服務的網站會將網頁導回我們指定的頁面,並帶有oauth_token參數。
所謂我們指定的頁面,有時是在第3步發出Request token要求時順便帶的參數,
例如Yahoo會在此時要我們送oauth_callback。但有時OAUTH認證服務的網站會讓我們事先設定,例如twitter。
有些網站也可能讓我們在第6步送出oauth_callback這個參數。

9.當我們的網站拿到了第8步回傳後的oauth_token,
就表示我們可以跟Access token URL發出請求了。
在這個請求中,我們除了要帶有oauth_token外,還需要第3步所需包含的參數。

10.此時提供OAuth認證服務的網站會回覆我們oauth_token,
不過這個oauth_token現在代表access token。
當我們取得access token 就代表取得一把可以存取OAuth認證服務的網站的鑰匙。

11.要怎麼透過access token存取提供OAuth認證服務的網站所提供的服務呢?
首先我們必須將以下參數傳送給提供OAUTH認證服務的網站。



根據OAuth的協定,
我們可以透過三種方式將這些參數送出,
分別是放到http authorization header中、透過POST方式與用GET方式傳送。
不過還是要看提供OAuth認證服務的網站是否有支援而定。
像Yahoo跟豆瓣網都只支援http authorization header的方式。

現在已經有很多網站使用OAUTH的方式提供其網路服務,
台灣也有不少開發者熟悉OAUTH的運作方式。
但還是希望這篇對OAUTH有興趣的朋友有所幫助。
(起碼整理下來,對我自己還蠻有幫助的:D)

Technorati 的標籤:,,,,,

    全站熱搜

    賽拉維‧柯南 發表在 痞客邦 留言(4) 人氣()