這兩天在研究Oauth2,打算來寫一個golang的範例,以oauth2為基礎做一個簡單的登入範例。
在研究的過程中順手整理了一下自己的理解, 如果有誤的話請糾正。
* Oauth2
* 使用場景,為什麼我們要使用Oauth2?
假設今天我們要開發一個應用程式,功能是可以將使用者存在google帳號底下的照片都匯入應用程式並且做一些處理,這時候就要想說,我們的應用程式要怎麼存取到使用者帳號底下的資源呢?
在以前我們可能會想說,使用者自行輸入他的google帳號密碼,我們開發的應用程式再藉由那組帳號密碼獲得存取照片的權限,藉此來對照片進行處理。 但是這樣會衍生出很多問題,主要就是如果該應用程式是藉由我們使用者的google帳號密碼來獲得權限的話,應用程式本身獲得的權限太多了,應用程式本來只需要照片的存取權而已,如果是拿google帳密的話則是拿到了整個帳號的使用權限。
如果現在有個不懷好意的應用程式獲得了你整個google帳號密碼的使用權限, 便可以透過它去登入很多不同的網站,又或者是拿去做非法的交易等等... 所以需要提出一個解決方法,一來是可以讓應用程式獲得他想要獲得的資源,二來是也不會開放太多的權限給應用程式,只授權部份的存取功能。
從另外一個角度來討論, 如果今天我很信任這個應用程式,把整個帳號的權限都交給了這個應用程式, 某一天決定之後可能不再使用這個應用程式了。 這時候我們如果想要把權限收回來怎麼做呢? 我們需要把帳號密碼重新設定一輪,才可以確保應用程式本身不再有獲得我帳號權限的能力。
總結一下傳統方法的缺點:
(1): 應用程式為了後續的操作可能會保留使用者的帳號密碼, 我們無法確定是否安全。
(2): 使用者無法限制應用程式能掌握到的權限,以及權限有效的時間。
(3): 修改密碼之後可以收回權限,不過也同時讓所有獲得用戶授權的第三方應用全部失效。
(4): 只要有一個第三方的應用程式出現了資料外洩問題,會導致其他第三方應用也有被盜用的危險。
以上這幾個論點就是為何我們需要藉由oauth來讓第三方應用所獲得的權限可以僅限於它所需要使用的部份。
簡單的說Oauth就是一種授權機制,以google為存放data的地方為例, 使用者告知google,授權第三方的應用程式可以獲得部份的資源, google的系統則產生一個token, 第三方的應用可以透過token來在實現內進行授權權限內的資料存取。
token vs. password
1. token是有時效性,時間到了會自動撤銷,不會讓第三方應用程式一直持有權限。
2. 如果今天不想要繼續授權給應用程式了,資源擁有者可以隨時撤銷token的有效性。
3. token最大的好處是有權限的管理,可以只開放部份的資源存取權給第三方的應用程式。
在後續的文章會大概介紹一下oauth2實際上是怎麼運作的,還有怎麼申請google的oauth2服務。
不過可能還要等個幾天,因為我還在研究XD