關於OAuth 2.0-以Facebook為例

    +--------+                                  +--------+
| Client | ------ user credentials ------> | Server |
+--------+ +--------+

request: 傳遞使用者憑證(如:帳號跟密碼)
response: 使用者個人資料
小劇場    +--------+                          +--------------------------+
| User | | Third-party applications |
+--------+ | (第三方) |
+--------------------------+
第三方跟Server說:我想要使用者的隱私資料,可以給我嗎?
Server回第三方說:可以阿,但你要先給我使用者的帳號跟密碼。
第三方跟User說:你可以給我你的帳號跟密碼嘛?因為我想要你的資料。
User跟第三方說:說給你就給你喔?
第三方:........
  • 第三方應用程序需要儲存使用者的憑證來使用,而這些密碼通常是明文。
  • Server端需要支持密碼的認證,儘管密碼含有安全性的漏洞問題。
  • 第三方應用程式會獲得幾乎完整的使用權限,可以存取受保護資料,而使用者不能限制第三方應用程式可以拿取資料的時限,以及可以存取的資料範圍(subset)。
  • 使用者不能撤銷第三方的權限,必須藉由更改使用者密碼的方式才行。
  • 任何第三方應用程式被破解,都會導致使用者的密碼和所有受該密碼保護的資料被破解。
  • Resource owner:可以授權別人去存取受保護資料資料。如果這個角色是人類的話,指的就是使用者(end-user)。
  • Resource server:存取受保護資料的Server,可以根據access Token來接受取得隱私資料的request。
  • Client:代表使用者去存取受保護資料的應用程式。「client」指的並不是任何特定的實做方式,任何在server端、桌面或設備上執行的應用程式,都可稱為client。
  • Authorization server:在認證過使用者的身份,且經由使用者許可後,就會簽發access token的server。
     +--------+                               +---------------+
| |--(A)- Authorization Request ->| Resource |
| | | Owner |
| |<-(B)-- Authorization Grant ---| |
| | +---------------+
| |
| | +---------------+
| |--(C)-- Authorization Grant -->| Authorization |
| Client | | Server |
| |<-(D)----- Access Token -------| |
| | +---------------+
| |
| | +---------------+
| |--(E)----- Access Token ------>| Resource |
| | | Server |
| |<-(F)--- Protected Resource ---| |
+--------+ +---------------+

Figure: Abstract Protocol Flow
  • A: Client端向resource owner發送授權的request。這個授權request可以直接向resource owner發送,或是由authorization server來發送request。
  • B: Client取得resource owner的authorization grant(授權許可)。這個許可,可以用來代表resource owner的授權。
  • C: Client端向authorization server請求access token,這時client端要認證自己,並給予從resource owner那邊取得的授權許可。
  • D: Authorization server在認證client端後,在驗證經由client端所傳來的授權許可。若兩者皆合法,就會簽發給client端access token。
  • E: Client端將由authorization server所得到access token傳在request中,向resource server來取得protected resource(受保護資料)。
  • F: Resource server驗證來自client端傳來的access token,若合法,就回傳受保護資料給client端。
     +--------+                               +---------------+
| |--(A)- Authorization Request ->| Resource |
| | | Owner |
| |<-(B)-- Authorization Grant ---| |
| | +---------------+
| |
| | +---------------+
| |--(C)-- Authorization Grant -->| Authorization |
| Client | | Server |
| |<-(D)----- Access Token -------| |
| | +---------------+
| |
| | +---------------+
| |--(E)----- Access Token ------>| Resource |
| | | Server |
| |<-(F)--- Protected Resource ---| |
+--------+ +---------------+

Figure: Facebook Protocol Flow
  • A: Client(第三方)將resource owner(使用者)的畫面導至Facebook認證頁。如下圖所示:
figure from: https://developers.facebook.com/docs/facebook-login/manually-build-a-login-flow/
https://www.facebook.com/v2.10/dialog/oauth?
client_id={app-id}
&redirect_uri={redirect-uri}
&scope=email
client_id: 申請facebook app所給予的app id。redirect_uri: 當使用者按下確定給予權限許可後,所導入的uri。
(其uri設定需要與facebook app中的「有效的 OAuth 重新導向 URI」一致)
scope: 第三方向使用者要求的權限。(例子中為第三方想向使用者提取email資料)*scope為非必要欄位,但若是要取得使用者特定資料就得設定。
  • B: 當resource owner按下確認按鈕後,就會將要取得的grant導向到上述API所設定的redirect_uri。
https://test.com/?code=...
  • C: Client端要向authorization server來索取access token。
GET https://graph.facebook.com/v2.10/oauth/access_token?
client_id={app-id}
&redirect_uri={redirect-uri}
&client_secret={app-secret}
&code={code-parameter}
client-id: 申請facebook app所給予的app id。
redirect-uri: 當使用者按下確定給予權限許可後,所導入的頁面。
client-secret: 申請facebook app所給予的金鑰。
code: 由「登入」動作重新導向後所得的參數(grant)。
  • D: Authorization server開始驗證client端的身份及驗證grant。若合法,會將access token傳入上述api所設定的redirect_uri中。
{
"access_token": {access-token},
"token_type": {type},
"expires_in": {seconds-til-expiration}
}
expires_in: 為access_token存活的時間。
  • E: 這時client就可以將透過access token來跟resource server索取resource owner受保護的資料。
  • F: 當驗證client端所傳過來的access token為合法後,就可以取得resource owner受保護的資料。

小結

--

--

--

Love podcasts or audiobooks? Learn on the go with our new app.

Get the Medium app

A button that says 'Download on the App Store', and if clicked it will lead you to the iOS App store
A button that says 'Get it on, Google Play', and if clicked it will lead you to the Google Play store
Justin Lee

Justin Lee

More from Medium

Verify if a PowerPoint Document is Digitally Signed Using Java

How to Chain Multiple Processors in Spring Batch?

An introduction to ByteBuffer

How to begin with JAVA