成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

用Go模擬實現單點登錄Token生成和驗證解析

開發 前端
資源服務端監聽本地的8081端口, 當接收到用戶請求之后, 首先從請求頭中的Authorization字段獲取Token令牌, 并對令牌進行解析, 如果正確解析出用戶ID, 返回該用戶的資源信息。

1.單點登錄(SSO)原理

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

SSO的工作原理涉及以下關鍵概念:

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

原理圖如下:

圖片圖片

2.JWT原理

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

JWT 由三部分組成:Header(頭部)、Payload(負載)和 Signature(簽名)。

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

JWT原理圖如下:

圖片圖片

3.使用Golang模擬實現過程

為了模擬單點登錄(SSO), 將創建兩個簡單的Golang服務: 一個用于認證用戶(認證中心), 另一個用于資源提供。用戶如果要獲取資源,必須先登錄認證中心獲取令牌, 然后再通過令牌訪問資源服務器, 下面是認證中心的服務端實現代碼:

package main

import (
  "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, "創建令牌失敗", 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) {
  // 創建負載
  payload := jwt.MapClaims{
    "user": userID,
    "exptime": time.Now().Add(time.Minute * 15).Unix(), // 令牌過期時間為15分鐘
  }

  // 創建 Token
  token := jwt.NewWithClaims(jwt.SigningMethodHS256, payload)

  // 簽名并獲取完整的 Token 字符串
  tokenString, err := token.SignedString(secretKey)
  if err != nil {
    return "", err
  }

  return tokenString, nil
}

在上面的代碼中, 認證中心服務端在本地監聽8080端口, 用來模擬處理用戶的登錄請求, 在收到用戶請求之后, 服務端根據用戶ID調用JWT的方法生成Token, 并將Token設置到HTTP頭的Authorization字段中返回給客戶端。

接下來實現資源提供的服務端,參考代碼如下:

package main

import (
  "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
  }

  // 在實際應用中,這里可以根據 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
}

在上面的代碼中, 資源服務端監聽本地的8081端口, 當接收到用戶請求之后, 首先從請求頭中的Authorization字段獲取Token令牌, 并對令牌進行解析, 如果正確解析出用戶ID, 返回該用戶的資源信息。

4.驗證實現結果

將上面兩段代碼分別編譯成兩個獨立Server端,并開啟兩個窗口分別運行。首先請求SSO服務端, 返回結果如下:

圖片圖片

從上圖可知,SSO服務端成功返回了一個Token令牌, 下面先不用Token訪問一下資源服務器試試:

圖片圖片

從上圖可以看到,沒有令牌無法正常請求到所需資源, 下面使用Apifox新建一個請求, 在里面加上Token, 如圖:

圖片圖片

保存之后, 帶著Token請求一下資源服務端, 如圖:

圖片圖片

可以看到, 成功返回了資源, 整個流程測試成功。



責任編輯:武曉燕 來源: 二進制空間安全
相關推薦

2024-09-27 12:13:26

GoGTokenSSO

2016-12-26 18:05:00

單點登錄原理簡單實現

2020-12-28 05:52:27

SSO登錄單點

2022-07-20 09:52:44

Go語言短信驗證碼

2023-03-09 08:12:08

免登錄實Python腳本

2024-06-21 09:28:43

2023-12-31 16:44:30

2018-06-25 12:35:31

2023-08-29 08:00:38

2012-02-14 14:17:35

ibmdw

2021-06-24 08:52:19

單點登錄代碼前端

2022-01-26 07:01:00

開源社區項目

2021-08-02 12:29:15

Python爬蟲網站

2024-08-12 08:12:38

2024-12-06 07:00:00

2020-05-15 08:07:33

JWT登錄單點

2021-10-29 13:26:54

單點登錄SSO

2023-05-19 07:43:11

2024-03-01 11:33:31

2025-06-05 02:22:00

點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 亚洲成人自拍网 | 高清视频一区二区三区 | 99热这里有精品 | 久久看精品 | 亚洲三级免费看 | 日韩欧美一区二区三区在线播放 | 国产一区二区三区四区三区四 | 成人午夜在线 | 一区二区三区四区在线播放 | 欧美黄色一区 | 欧美一级做性受免费大片免费 | 日韩精品成人免费观看视频 | 中文字幕在线三区 | 黄色成人在线观看 | 亚洲一区在线日韩在线深爱 | 午夜爽爽男女免费观看hd | 久免费视频 | 成人免费观看视频 | 久久www免费人成看片高清 | 亚洲免费在线观看 | 91久久精| 一级做受毛片免费大片 | 99国产视频| 欧美一级在线观看 | 二区中文字幕 | 国产高清在线精品 | 久久久久久91香蕉国产 | 欧美6一10sex性hd | 97热在线 | 91视频大全 | 久久成人综合 | 亚洲精品一区二区三区四区高清 | 亚洲最大成人综合 | 草草影院ccyy| 午夜欧美一区二区三区在线播放 | 香蕉久久网 | 亚洲视频在线看 | 精品视频久久久久久 | 欧美日韩一区在线观看 | 懂色av一区二区三区在线播放 | 99精品国自产在线 |