--- title: day09 帳戶登入授權機制之前端與後端交互 tags: iThome(2022) description: note --- # day09 帳戶登入授權機制之前端與後端交互 ### cookie authorization 在運用cookie情況下,使用者在登入伺服器後,伺服器會在後端生成一串unique的token,並且回傳給使用者,使用者在每次發送request給後端時cookie都會帶token一起發送到後端,後端會根據token返回權限,以下將介紹user登入後端運用cookie生成token的過程為何。 ![](https://i.imgur.com/AMNaMHP.png) 1. 使用者發出request給後端要求註冊帳號 2. 後端將密碼透過hash加密,並且儲存於database 3. 使用者在發出登入request給後端要求登入 4. 後端會在透過hash加密使用者密碼後比對database裡帳戶資訊,如果相同則升成一串token儲存於database並且返回cookie給前端,此token會帶有效時限 5. 此後前端發出每個request都會帶著cookie資訊給後端,如果token過期,比對token失敗後則會拒絕訪問 ### JWT(JSON Web Token)介紹 為restapi的其中一種架構機制,在使用者透過JWT對後端請求資源,後端會驗證此JWT的資訊是否有效返回對應內容給前端。 JWT由三個部分所組成Header、Payload、Signature所組成 * Header: 通常由演算法加密,Token類型所組成的JSON,之後會在經由Base64 URL編碼 * Payload: 放置要傳給後端的資料 * Signature: Header(base64後)、Payload(base64後)、secret ### OAuth2.0 OAuth2.0為使用第三方授權登入應用程式,此時應用程式從第三方業者取得基本用戶資料,使用者就不需要使用帳密登入伺服器,假設今天進入hackmd透過google帳號登入,詳細流程後面會介紹,這裡先介紹OAuth2.0常見名詞 * Resource Owner: 這裡指使用者,指擁有決定給予權限與否的使用者 * Resource Server: 這裡擁有帳戶資訊的伺服器端,如上述google * Client: 指第三方應用程式如上述hackmd * Authorization Server: 驗證Resource Owner身分,同意後會發放token給第三方伺服器,並同意使用者的登入 ![](https://i.imgur.com/UDT8OHd.png) 1. 首先點擊Client登入會導到Authorization Server,使用者可以選擇要授權給Client的資訊,常見如: Client Id、Redirect URI、Response Type、Scope 2. Authorization Server進行身分驗證後,會根據剛剛設定的scope,確認是否同意授權,會明確標示要授權的資訊,如:名稱、email等等 3. 同意授權後會導向Redirect URI,並且將token以及相關資訊透過前面設定的Response Type回覆Authorization grant給使用者 4. Client端獲得Authorization grant後,會拿著他再向Authorization Server要求token,Authorization Server會在此驗證資訊以及Client身分後核發token 5. 最終使用者帶著此token向Client發送request,此時Client也只會取得使用者授權的資訊 ### OpenID 上面提到的OAuth2.0只有提供登入授權,OIDC(OpenID Connection)目的是認證(Authentication),OAuth2.0目的則是授權(Authorization),並擴充了在OAuth2.0不足的機制 * ID Token:認證所需的用戶資訊,這是 OIDC 最重要的擴充。不要和 OAuth 2.0 的 Access Token 攪混了,Access Token 是用於授權,不帶有用戶資訊來做認證。 * UserInfo Endpoint:除了上面 ID Token 提供基本用戶資訊,OIDC 還規定認證提供者應提供一個 API 界面,讓 Client 能取的更完整的用戶資訊。 * Standard Set of Scopes:OAuth 2.0 沒有定義 scope(忘記這是什麼了嗎?先回去看一下前一篇文章吧!),造成 Facebook 可能有 Facebook 的 scope,Google 有 Google 的 scope,實做的時候必須參閱各家的手冊客製化。OIDC 規範了共通的 scope 讓大家有規可循。詳細規範可以參考文件。 ![](https://i.imgur.com/hbUO4KJ.png) 流程圖將 OIDC 變動的部份醒目標示。第一個變化是第 2 步在要求 Authorization Code 的時候,scope 新增了 openid 值。 第二個不一樣的地方,是第 8 步在換 Access Token 的時候,除了取得 Access Token,還取得了 ID Token。這是因為前面的scope 有指定 openid ,讓 Client 有取得 ID Token 的權限。 最後的差異是第 10 步。先前 OAuth 2.0 的流程在取得授權後是去存取用戶持有的資源(用戶的照片、文件等等),但 OIDC 的目的是認證。這邊是從 OIDC UserInfo Endpoint 取得認證所需的用戶資訊,來完成註冊的流程。 ### SALM SALM透過http傳送經由base64編碼過後的xml文件,其中會包含使用者的認證(Authentication)與授權(Authorization)相關的資訊,其好處為保密性更高,其概念如同上述儲存在cookie authorization機制,因此詳細內如探討實作。 ![](https://i.imgur.com/m5ow0a6.png) * https://medium.com/%E9%BA%A5%E5%85%8B%E7%9A%84%E5%8D%8A%E8%B7%AF%E5%87%BA%E5%AE%B6%E7%AD%86%E8%A8%98/%E7%AD%86%E8%A8%98-%E8%AA%8D%E8%AD%98-oauth-2-0-%E4%B8%80%E6%AC%A1%E4%BA%86%E8%A7%A3%E5%90%84%E8%A7%92%E8%89%B2-%E5%90%84%E9%A1%9E%E5%9E%8B%E6%B5%81%E7%A8%8B%E7%9A%84%E5%B7%AE%E7%95%B0-c42da83a6015 * https://mgleon08.github.io/blog/2018/07/16/jwt/ * https://ithelp.ithome.com.tw/articles/10264580 * https://medium.com/%E4%BC%81%E9%B5%9D%E4%B9%9F%E6%87%82%E7%A8%8B%E5%BC%8F%E8%A8%AD%E8%A8%88/jwt-json-web-token-%E5%8E%9F%E7%90%86%E4%BB%8B%E7%B4%B9-74abfafad7ba * https://5xruby.tw/posts/what-is-jwt * https://medium.com/@henry-chou/%E8%88%87%E4%BC%81%E6%A5%AD%E6%95%B4%E5%90%88%E9%A9%97%E8%AD%89%E7%B3%BB%E7%B5%B1-saml-%E9%A9%97%E8%AD%89-1c5dc32a17cd ## Thank you! :dash: You can find me on - GitHub: https://github.com/shaung08 - Email: a2369875@gmail.com