日韩成人免费在线_国产成人一二_精品国产免费人成电影在线观..._日本一区二区三区久久久久久久久不

當前位置:首頁 > 科技  > 軟件

用Go模擬實現(xiàn)單點登錄Token生成和驗證解析

來源: 責編: 時間:2024-01-15 09:20:58 212觀看
導讀1.單點登錄(SSO)原理單點登錄(Single Sign-On,簡稱SSO)是一種身份驗證和授權機制,允許用戶在訪問多個相關獨立的系統(tǒng)或應用程序時只需一次登錄, 而不需要為每個系統(tǒng)都提供單獨的身份驗證憑證。SSO的目的是簡化用戶體

1.單點登錄(SSO)原理

單點登錄(Single Sign-On,簡稱SSO)是一種身份驗證和授權機制,允許用戶在訪問多個相關獨立的系統(tǒng)或應用程序時只需一次登錄, 而不需要為每個系統(tǒng)都提供單獨的身份驗證憑證。SSO的目的是簡化用戶體驗、提高安全性, 并減少用戶因頻繁登錄而可能面臨密碼疲勞問題。a5D28資訊網——每日最新資訊28at.com

SSO的工作原理涉及以下關鍵概念:a5D28資訊網——每日最新資訊28at.com

  • 身份提供者(Identity Provider, IdP): 負責驗證用戶的身份并生成令牌(Token)。IdP通常是一個中心化的認證系統(tǒng), 負責向其他相關系統(tǒng)提供認證服務。
  • 服務提供者(Service Provider, SP): 各個系統(tǒng)或應用程序, 它們依賴于IdP來驗證用戶身份。SP接收到IdP頒發(fā)的令牌后, 可以通過驗證令牌的有效性來信任用戶身份。
  • 令牌(Token): 由IdP頒發(fā), 包含有關用戶身份的信息, 以及可能的授權信息。
  • 單一登錄會話(Single Sign-On Session): 用戶只需一次登錄到IdP,然后就可以訪問所有與IdP集成的SP, 而無需再次提供用戶名和密碼。

原理圖如下:a5D28資訊網——每日最新資訊28at.com

圖片圖片a5D28資訊網——每日最新資訊28at.com

2.JWT原理

JWT 是一種基于 JSON 格式的輕量級令牌,其主要原理是通過在服務端生成一個包含用戶信息的 JSON 對象,然后使用密鑰對該對象進行簽名,生成一個令牌。這個令牌可以被發(fā)送到客戶端,客戶端可以在之后的請求中攜帶該令牌,服務端使用密鑰驗證令牌的簽名,并解析其中的信息, 從而完成身份驗證。a5D28資訊網——每日最新資訊28at.com

JWT 由三部分組成:Header(頭部)、Payload(負載)和 Signature(簽名)。a5D28資訊網——每日最新資訊28at.com

  • Header(頭部):包含了兩部分信息,token 的類型(JWT)和使用的簽名算法,通常是 Base64 編碼的 JSON 字符串。
  • Payload(負載):包含了一些聲明(Claim),其中包括標準聲明、私有聲明等。這部分也是 Base64 編碼的 JSON 字符串,用于攜帶一些關鍵的信息。
  • Signature(簽名):由前兩部分使用指定的算法簽名而成,用于驗證消息的完整性。

JWT原理圖如下:a5D28資訊網——每日最新資訊28at.com

圖片圖片a5D28資訊網——每日最新資訊28at.com

3.使用Golang模擬實現(xiàn)過程

為了模擬單點登錄(SSO), 將創(chuàng)建兩個簡單的Golang服務: 一個用于認證用戶(認證中心), 另一個用于資源提供。用戶如果要獲取資源,必須先登錄認證中心獲取令牌, 然后再通過令牌訪問資源服務器, 下面是認證中心的服務端實現(xiàn)代碼:a5D28資訊網——每日最新資訊28at.com

package mainimport (  "fmt"  "net/http"  "time"  "github.com/dgrijalva/jwt-go")var secretKey = []byte("btk.gqv7jtu7VZD1dar")func main() {  http.HandleFunc("/login", handleLogin)  http.ListenAndServe(":8080", nil)}func handleLogin(w http.ResponseWriter, r *http.Request) {  // 在實際應用中,這里應該有用戶認證的邏輯,為了簡化,這里直接使用一個固定用戶  userID := "9527"  tokenString, err := createToken(userID)  if err != nil {    http.Error(w, "創(chuàng)建令牌失敗", http.StatusInternalServerError)    return  }  // 將 JWT 令牌附加到響應中  w.Header().Set("Authorization", "Bearer "+tokenString)  w.WriteHeader(http.StatusOK)  fmt.Fprintf(w, "登錄成功. Token: %s", tokenString)}func createToken(userID string) (string, error) {  // 創(chuàng)建負載  payload := jwt.MapClaims{    "user": userID,    "exptime": time.Now().Add(time.Minute * 15).Unix(), // 令牌過期時間為15分鐘  }  // 創(chuàng)建 Token  token := jwt.NewWithClaims(jwt.SigningMethodHS256, payload)  // 簽名并獲取完整的 Token 字符串  tokenString, err := token.SignedString(secretKey)  if err != nil {    return "", err  }  return tokenString, nil}

在上面的代碼中, 認證中心服務端在本地監(jiān)聽8080端口, 用來模擬處理用戶的登錄請求, 在收到用戶請求之后, 服務端根據(jù)用戶ID調用JWT的方法生成Token, 并將Token設置到HTTP頭的Authorization字段中返回給客戶端。a5D28資訊網——每日最新資訊28at.com

接下來實現(xiàn)資源提供的服務端,參考代碼如下:a5D28資訊網——每日最新資訊28at.com

package mainimport (  "fmt"  "net/http"  "github.com/dgrijalva/jwt-go")var secretKey = []byte("btk.gqv7jtu7VZD1dar")func main() {  http.HandleFunc("/resource", handleResource)  http.ListenAndServe(":8081", nil)}func handleResource(w http.ResponseWriter, r *http.Request) {  // 從請求中獲取 Authorization 頭  authHeader := r.Header.Get("Authorization")  if authHeader == "" {    http.Error(w, "未找到Authorization字段", http.StatusUnauthorized)    return  }  // 解析JWT令牌  tokenString := authHeader[len("Bearer "):]  token, err := parseToken(tokenString)  if err != nil || !token.Valid {    http.Error(w, "令牌不合法", http.StatusUnauthorized)    return  }  // 獲取負載信息  claims, ok := token.Claims.(jwt.MapClaims)  if !ok {    http.Error(w, "令牌不合法", http.StatusUnauthorized)    return  }  userID, ok := claims["user"].(string)  if !ok {    http.Error(w, "訪問令牌中的用戶不存在", http.StatusUnauthorized)    return  }  // 在實際應用中,這里可以根據(jù) userID 獲取用戶信息或提供資源  // 這里只是一個簡單的示例  response := fmt.Sprintf("用戶ID%s獲取資源成功!", userID)  w.WriteHeader(http.StatusOK)  fmt.Fprintf(w, response)}func parseToken(tokenString string) (*jwt.Token, error) {  // 解析 Token 字符串  token, err := jwt.Parse(tokenString, func(token *jwt.Token) (interface{}, error) {    return secretKey, nil  })  if err != nil {    return nil, err  }  return token, nil}

在上面的代碼中, 資源服務端監(jiān)聽本地的8081端口, 當接收到用戶請求之后, 首先從請求頭中的Authorization字段獲取Token令牌, 并對令牌進行解析, 如果正確解析出用戶ID, 返回該用戶的資源信息。a5D28資訊網——每日最新資訊28at.com

4.驗證實現(xiàn)結果

將上面兩段代碼分別編譯成兩個獨立Server端,并開啟兩個窗口分別運行。首先請求SSO服務端, 返回結果如下:a5D28資訊網——每日最新資訊28at.com

圖片圖片a5D28資訊網——每日最新資訊28at.com

從上圖可知,SSO服務端成功返回了一個Token令牌, 下面先不用Token訪問一下資源服務器試試:a5D28資訊網——每日最新資訊28at.com

圖片圖片a5D28資訊網——每日最新資訊28at.com

從上圖可以看到,沒有令牌無法正常請求到所需資源, 下面使用Apifox新建一個請求, 在里面加上Token, 如圖:a5D28資訊網——每日最新資訊28at.com

圖片圖片a5D28資訊網——每日最新資訊28at.com

保存之后, 帶著Token請求一下資源服務端, 如圖:a5D28資訊網——每日最新資訊28at.com

圖片圖片a5D28資訊網——每日最新資訊28at.com

可以看到, 成功返回了資源, 整個流程測試成功。a5D28資訊網——每日最新資訊28at.com


a5D28資訊網——每日最新資訊28at.com


a5D28資訊網——每日最新資訊28at.com

本文鏈接:http://www.www897cc.com/showinfo-26-60955-0.html用Go模擬實現(xiàn)單點登錄Token生成和驗證解析

聲明:本網頁內容旨在傳播知識,若有侵權等問題請及時與本網聯(lián)系,我們將在第一時間刪除處理。郵件:2376512515@qq.com

上一篇: Rust越來越流行了!盤點使用Rust的五大項目

下一篇: 基于Doris ,打造快速、安全、高可靠的實時數(shù)據(jù)倉庫

標簽:
  • 熱門焦點
  • CSS單標簽實現(xiàn)轉轉logo

    轉轉品牌升級后更新了全新的Logo,今天我們用純CSS來實現(xiàn)轉轉的新Logo,為了有一定的挑戰(zhàn)性,這里我們只使用一個標簽實現(xiàn),將最大化的使用CSS能力完成Logo的繪制與動畫效果。新logo
  • JavaScript學習 -AES加密算法

    引言在當今數(shù)字化時代,前端應用程序扮演著重要角色,用戶的敏感數(shù)據(jù)經常在前端進行加密和解密操作。然而,這樣的操作在網絡傳輸和存儲中可能會受到惡意攻擊的威脅。為了確保數(shù)據(jù)
  • 一文掌握 Golang 模糊測試(Fuzz Testing)

    模糊測試(Fuzz Testing)模糊測試(Fuzz Testing)是通過向目標系統(tǒng)提供非預期的輸入并監(jiān)視異常結果來發(fā)現(xiàn)軟件漏洞的方法。可以用來發(fā)現(xiàn)應用程序、操作系統(tǒng)和網絡協(xié)議等中的漏洞或
  • 使用Webdriver-manager解決瀏覽器與驅動不匹配所帶來自動化無法執(zhí)行的問題

    1、前言在我們使用 Selenium 進行 UI 自動化測試時,常常會因為瀏覽器驅動與瀏覽器版本不匹配,而導致自動化測試無法執(zhí)行,需要手動去下載對應的驅動版本,并替換原有的驅動,可能還
  • 電視息屏休眠仍有網絡上傳 愛奇藝被質疑“薅消費者羊毛”

    記者丨寧曉敏 見習生丨汗青出品丨鰲頭財經(theSankei) 前不久,愛奇藝發(fā)布了一份亮眼的一季報,不僅營收和會員營收創(chuàng)造歷史最佳表現(xiàn),其運營利潤也連續(xù)6個月實現(xiàn)增長。自去年年初
  • 中國家電海外掘金正當時|出海專題

    作者|吳南南編輯|胡展嘉運營|陳佳慧出品|零態(tài)LT(ID:LingTai_LT)2023年,出海市場戰(zhàn)況空前,中國創(chuàng)業(yè)者在海外紛紛摩拳擦掌,以期能夠把中國的商業(yè)模式、創(chuàng)業(yè)理念、戰(zhàn)略打法輸出海外,他們依
  • 蘋果公司要求三星和LG Display生產「無邊框」OLED iPhone顯示屏

    據(jù) The Elec 報道,蘋果已要求其供應商為未來的 iPhone 型號開發(fā)「無邊框」OLED 顯示面板。蘋果顯然已要求三星和 LG Display 開發(fā)新的 OLED 顯示面
  • 2299元起!iQOO Pad開啟預售:性能最強天璣平板

    5月23日,iQOO如期舉行了新品發(fā)布會,除了首發(fā)安卓最強旗艦處理器的iQOO Neo8系列新機外,還在發(fā)布會上推出了旗下首款平板電腦——iQOO Pad,其搭載了天璣
  • OPPO K11評測:旗艦級IMX890加持 2000元檔最強影像手機

    【Techweb評測】中端機型用戶群體巨大,占了中國目前手機市場的大頭,一直以來都是各手機品牌的“必爭之地”,其中OPPO K系列機型一直以來都以高品質、
Top 主站蜘蛛池模板: 阿图什市| 湛江市| 汉源县| 湾仔区| 赫章县| 乐陵市| 禄劝| 小金县| 武胜县| 青岛市| 乌海市| 泸西县| 年辖:市辖区| 开鲁县| 胶州市| 深圳市| 新乐市| 宁明县| 忻州市| 枞阳县| 石首市| 新疆| 恭城| 旺苍县| 盐源县| 云龙县| 喜德县| 远安县| 长治市| 定南县| 江西省| 灵璧县| 汝州市| 长沙县| 杨浦区| 图木舒克市| 禄劝| 莒南县| 彩票| 修武县| 石林|