OAuth 2.0
阿新 • • 發佈:2020-10-13
OAuth 2.0
OAuth 2.0 是一種授權機制,主要用來頒發令牌(token)。OAuth 的核心就是向第三方應用頒發令牌。
概念及解釋
- 授權碼(authorization-code) // 需要經過授權碼,適用於有前後端
- 隱藏式(implicit) // 適用於沒有後端的應用,不需要授權碼
- 密碼式(password): // 直接用使用者名稱密碼,用於內部應用
- 客戶端憑證(client credentials) // 適用與對APP授權,而不是單個使用者
四種方式都需要在B站先註冊
OpenID 和 OAuth
兩者很像,但本質上來說它們是截然不同的兩個東西:
- OpenID: 只用於 身份認證(Authentication),允許你以 同一個賬戶 在 多個網站登陸。它僅僅是為你的 合法身份 背書,當你以 Facebook 賬號登陸某個站點之後,該站點 無權訪問 你的在 Facebook 上的 資料。
- OAuth: 用於 授權(Authorisation),允許 被授權方 訪問 授權方 的 使用者資料。
Access Token 和 Refresh Token
職責的分離:
- refresh token: 負責 身份認證;
- access token: 負責 請求資源。
JWT(JsonWebToken)
JWT 顧名思義,它是 JSON 結構的 token,由三部分組成:
- header
- payload
- signature
header 用於描述 元資訊,例如產生 signature 的演算法:
{ "typ": "JWT", "alg": "HS256"}
payload 用於攜帶你希望 向服務端傳遞的資訊。你既可以往裡新增 官方欄位,例如:iss(Issuer), sub(Subject), exp(Expirationtime),也可以塞入 自定義的欄位
{ "userId": "b08f86af-35da-48f2-8fab-cef3904660bd"}
signature 譯為 簽名,建立簽名要分以下幾個步驟:
- 從 介面服務端 拿到 金鑰,假設為 secret。
- 對 header 進行 base64 編碼,假設結果為 headerStr。
- 將 payload 進行 base64 編碼,假設結果為 payloadStr。
- 將 headerStr 和 payloadStr 用 . 字元 拼裝起來成為字元 data。
- 以 data 和 secret 作為引數,使用 雜湊演算法 計算出 簽名。