iT邦幫忙

1

如何使用 Node.js Express 建立符合 OAuth2 規範的 Authorization Server?

想達成的功能
一個符合 OAuth2 規範的 Authorization Provider,希望能單純使用 Express.js 來實現,或至少不採用現存的 OAuth2 套件(例如可以用 jsonwebtoken 這個套件來生成 JWT)。


想請求的協助
不敢厚顏奢望有大大特地寫一篇…請問是否有推薦的教學文章或範例?目前搜尋到的教學幾乎都是用套件,但公司要求這個案子在 OAuth2 的部份不要使用套件。唯一找到一個不是使用套件的教學實作的 GrantType 是 Password ,我想優先做 Authorization Code Flow 。(另外想請教為什麼會有 Password Flow?可以直接拿帳密的話,第三方擁有帳密的話不就等同擁有 User 的完整權限?)

或者有沒有推薦相關的教學課程或影片(付費的也可以)。


我目前的理解
目前看了蠻多文章,覺得對功能跟規範還是似懂非懂。主要參考的文章是這系列,對照 RFC6749 一起看 (Yu-Cheng Chuang’s Blog - OAuth 2.0 筆記 (1) 世界觀)

其他也看了很多中英文的介紹,在 OAuth2 的四個角色的介紹及四種 Grant Flow 的介紹都講的很詳細,但幾乎都沒有實作細節(或者說沒有用 Express 的教學範例…)

看完還是不太懂我到底要實現哪些功能才是一個基本的 Auth Provider,所以先嘗試使用了 Google 的第三方登入,先從當第三方來觀察四者之間的互動有哪些,有什麼 Endpoint 。目前推測要完成的功能有

.Auth Server & Resource Server

  • 讓 Client 註冊服務的功能, Client 提供 redirectUrl 及 site domain,Auth Server 提供 client_id 及 client_secret 給 Client
  • User 的登入註冊功能
  • 透過 Auth API 登入後要驗證 client_id 及 redirectUrl 是否 match ,是的話就發一組 grant code 給 Client
  • 驗證 Client 送來的 POST Request(包含 grant code、client_id 及 client_secret 等資訊),正確的話發給 access_token
  • Resources Server 要提供 API 讓 Client 可以通過 access_token 來存取資源

因為我要做的也就是第三方登入而已,觀察 Google 的服務,它在把 access_token response 回來的同時就把 id_token 一起送過來了,那 access_token 要用來幹嘛 ... orz

我的 Resource Server 擁有的資源或說唯一要提供的資訊就是 User 的 unquine id(或基本的 profile) ,讓第三方知道我這裡確實有這個人而且他能正確登入。所以在這個情境下,其實用不到 access_token ?我原本的想法是拿到 access_token 之後再去跟 Resource Server 要 UserProfile ,但看了 Google 的做法之後開始疑惑起 access_token 要用在哪…

雖然我不知道 access_token 現在要用在哪,也許以外要增加提供其他機密資訊就會用到。但總之 Resource Server 必需要能解讀 access_token 對嗎?要怎麼驗證 access_token 是正確的?是要把 access_token 存資料庫嗎?還是一樣弄成 JWT,但弄成 JWT 就代表 Resource Server 也會知道 client_secret,這樣做符合規範嗎?或者 Auth Server 要另外提供 API 用來驗證 access_token

另外想問關於 Google 的第三方登入,我找到的文件幾乎都是用 Google 提供的 SDK 來做,只有一篇教學提供了 Endpoint 跟 Parameter。
Google API authentication with OAuth 2 —on the example of gmail

想請問該如何快速有效的找到這些 Endpoint 跟使用規範?包括 Google API 有哪些 scope 可以使用,我一整個找到眼花繚亂,看 Google 的文件也都是先提供 SDK 的用法…
/images/emoticon/emoticon06.gif

這是我轉職後第一個全端任務 @@,有些概念其實還不是很熟悉,搞不好提問內容也有誤解 Orz … 請多包涵,先在此謝過
/images/emoticon/emoticon41.gif

看更多先前的討論...收起先前的討論...
fillano iT邦超人 1 級 ‧ 2019-11-12 16:38:31 檢舉
https://github.com/NCTU-OAuth/document/blob/master/developer_doc.md 功能簡單,你可以參考看看
fillano iT邦超人 1 級 ‧ 2019-11-12 16:56:02 檢舉
看起來你要做的是Authorization Server這個角色?你需要準備一個登入畫面跟幾個api:
1. Client收到Resource Owner的Grant,會持著Grant導到你的登入畫面。登入成功後,你產生一組Access_Token與這個Grant對應然後存起來,把Access_Token發給Client,然後Client再被導回Resource Server
2. Resource Server收到Access_Token,會跟Authorization Server驗證這個是否合法,如果Grant跟Access_Token對的起來就沒錯
3. 然後Client就可以使用Resource Server上面的資源

我知道的概念大概是這樣。
dragonH iT邦超人 5 級 ‧ 2019-11-12 17:29:40 檢舉
看起來好像

比較複雜的前後端分離登入實做
是 fillano 大大 ! 0w0

之前在資策會上課的結業專題從您的鐵人賽系列文〔且戰且走HTML5 系列〕得到很多收穫及幫助 ~感謝您 ~

Authorization Server 及 Resource Server 都是我現在的任務,未來 Client 也可能會是我 Orz 但也會有其他 Client 要使用(都自家系統),但因為唯一的資源就是 User Profile ,說是只做 Authorization Server 好像也對…至少我試用 Google 的系統看起來好像是這樣

您提供的連結及回答我要思考消化一下,現在感覺我對 Grant 及 Access_Token 的產生方式及對應條件很模糊,先想一下再來請教 <(_ _)>
fillano iT邦超人 1 級 ‧ 2019-11-13 09:30:27 檢舉
https://openhome.cc/Gossip/Spring/OAuth2Flows.html
良葛格這幾張圖解釋蠻清楚,請參考最後一張。
fillano iT邦超人 1 級 ‧ 2019-11-13 09:32:34 檢舉
https://speakerdeck.com/chitsaou/jian-dan-yi-dong-de-oauth-2-dot-0
這個簡報也蠻清楚,改念釐清了,寫程式就不困難
thwu iT邦新手 5 級 ‧ 2019-11-13 09:50:05 檢舉
雖然幫不上忙,但想給這種提問的格式和態度 100 個讚
@fillano
喔喔這個圖好棒~簡報最開始讀文件的時候看過,現在對流程跟角色定位比較了解之後應該再來重讀一次了。

@thwu
謝謝 :-)

尚未有邦友回答

立即登入回答