AVt天堂网 手机版,亚洲va久久久噜噜噜久久4399,天天综合亚洲色在线精品,亚洲一级Av无码毛片久久精品

當(dāng)前位置:首頁(yè) > 科技  > 軟件

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

來(lái)源: 責(zé)編: 時(shí)間:2024-01-15 09:20:58 235觀看
導(dǎo)讀1.單點(diǎn)登錄(SSO)原理單點(diǎn)登錄(Single Sign-On,簡(jiǎn)稱SSO)是一種身份驗(yàn)證和授權(quán)機(jī)制,允許用戶在訪問(wèn)多個(gè)相關(guān)獨(dú)立的系統(tǒng)或應(yīng)用程序時(shí)只需一次登錄, 而不需要為每個(gè)系統(tǒng)都提供單獨(dú)的身份驗(yàn)證憑證。SSO的目的是簡(jiǎn)化用戶體

1.單點(diǎn)登錄(SSO)原理

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

SSO的工作原理涉及以下關(guān)鍵概念:3P828資訊網(wǎng)——每日最新資訊28at.com

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

原理圖如下:3P828資訊網(wǎng)——每日最新資訊28at.com

圖片圖片3P828資訊網(wǎng)——每日最新資訊28at.com

2.JWT原理

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

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

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

JWT原理圖如下:3P828資訊網(wǎng)——每日最新資訊28at.com

圖片圖片3P828資訊網(wǎng)——每日最新資訊28at.com

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

為了模擬單點(diǎn)登錄(SSO), 將創(chuàng)建兩個(gè)簡(jiǎn)單的Golang服務(wù): 一個(gè)用于認(rèn)證用戶(認(rèn)證中心), 另一個(gè)用于資源提供。用戶如果要獲取資源,必須先登錄認(rèn)證中心獲取令牌, 然后再通過(guò)令牌訪問(wèn)資源服務(wù)器, 下面是認(rèn)證中心的服務(wù)端實(shí)現(xiàn)代碼:3P828資訊網(wǎng)——每日最新資訊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) {  // 在實(shí)際應(yīng)用中,這里應(yīng)該有用戶認(rèn)證的邏輯,為了簡(jiǎn)化,這里直接使用一個(gè)固定用戶  userID := "9527"  tokenString, err := createToken(userID)  if err != nil {    http.Error(w, "創(chuàng)建令牌失敗", http.StatusInternalServerError)    return  }  // 將 JWT 令牌附加到響應(yīng)中  w.Header().Set("Authorization", "Bearer "+tokenString)  w.WriteHeader(http.StatusOK)  fmt.Fprintf(w, "登錄成功. Token: %s", tokenString)}func createToken(userID string) (string, error) {  // 創(chuàng)建負(fù)載  payload := jwt.MapClaims{    "user": userID,    "exptime": time.Now().Add(time.Minute * 15).Unix(), // 令牌過(guò)期時(shí)間為15分鐘  }  // 創(chuàng)建 Token  token := jwt.NewWithClaims(jwt.SigningMethodHS256, payload)  // 簽名并獲取完整的 Token 字符串  tokenString, err := token.SignedString(secretKey)  if err != nil {    return "", err  }  return tokenString, nil}

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

接下來(lái)實(shí)現(xiàn)資源提供的服務(wù)端,參考代碼如下:3P828資訊網(wǎng)——每日最新資訊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) {  // 從請(qǐng)求中獲取 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  }  // 獲取負(fù)載信息  claims, ok := token.Claims.(jwt.MapClaims)  if !ok {    http.Error(w, "令牌不合法", http.StatusUnauthorized)    return  }  userID, ok := claims["user"].(string)  if !ok {    http.Error(w, "訪問(wèn)令牌中的用戶不存在", http.StatusUnauthorized)    return  }  // 在實(shí)際應(yīng)用中,這里可以根據(jù) userID 獲取用戶信息或提供資源  // 這里只是一個(gè)簡(jiǎn)單的示例  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}

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

4.驗(yàn)證實(shí)現(xiàn)結(jié)果

將上面兩段代碼分別編譯成兩個(gè)獨(dú)立Server端,并開(kāi)啟兩個(gè)窗口分別運(yùn)行。首先請(qǐng)求SSO服務(wù)端, 返回結(jié)果如下:3P828資訊網(wǎng)——每日最新資訊28at.com

圖片圖片3P828資訊網(wǎng)——每日最新資訊28at.com

從上圖可知,SSO服務(wù)端成功返回了一個(gè)Token令牌, 下面先不用Token訪問(wèn)一下資源服務(wù)器試試:3P828資訊網(wǎng)——每日最新資訊28at.com

圖片圖片3P828資訊網(wǎng)——每日最新資訊28at.com

從上圖可以看到,沒(méi)有令牌無(wú)法正常請(qǐng)求到所需資源, 下面使用Apifox新建一個(gè)請(qǐng)求, 在里面加上Token, 如圖:3P828資訊網(wǎng)——每日最新資訊28at.com

圖片圖片3P828資訊網(wǎng)——每日最新資訊28at.com

保存之后, 帶著Token請(qǐng)求一下資源服務(wù)端, 如圖:3P828資訊網(wǎng)——每日最新資訊28at.com

圖片圖片3P828資訊網(wǎng)——每日最新資訊28at.com

可以看到, 成功返回了資源, 整個(gè)流程測(cè)試成功。3P828資訊網(wǎng)——每日最新資訊28at.com


3P828資訊網(wǎng)——每日最新資訊28at.com


3P828資訊網(wǎng)——每日最新資訊28at.com

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

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

上一篇: Rust越來(lái)越流行了!盤點(diǎn)使用Rust的五大項(xiàng)目

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

標(biāo)簽:
  • 熱門焦點(diǎn)
  • 紅魔電競(jìng)平板評(píng)測(cè):大屏幕硬實(shí)力

    前言:三年的疫情因?yàn)橐暇W(wǎng)課的原因激活了平板市場(chǎng),如今網(wǎng)課的時(shí)代已經(jīng)過(guò)去,大家的生活都恢復(fù)到了正軌,這也就意味著,真正考驗(yàn)平板電腦生存的環(huán)境來(lái)了。也就是面對(duì)著這種殘酷的
  • 8月總票房已突破10億!《封神》第一:口碑已經(jīng)成了

    8月5日消息,據(jù)燈塔專業(yè)版數(shù)據(jù),截至8月5日9時(shí)35分,8月總票房(含預(yù)售)已突破10億。其中,《封神》以大比分的優(yōu)勢(shì)領(lǐng)先。根據(jù)官方消息,目前該片總票房已經(jīng)超過(guò)14.
  • 三萬(wàn)字盤點(diǎn) Spring 九大核心基礎(chǔ)功能

    大家好,我是三友~~今天來(lái)跟大家聊一聊Spring的9大核心基礎(chǔ)功能。話不多說(shuō),先上目錄:圖片友情提示,本文過(guò)長(zhǎng),建議收藏,嘿嘿嘿!一、資源管理資源管理是Spring的一個(gè)核心的基礎(chǔ)功能,不
  • WebRTC.Net庫(kù)開(kāi)發(fā)進(jìn)階,教你實(shí)現(xiàn)屏幕共享和多路復(fù)用!

    WebRTC.Net庫(kù):讓你的應(yīng)用更親民友好,實(shí)現(xiàn)視頻通話無(wú)痛接入! 除了基本用法外,還有一些進(jìn)階用法可以更好地利用該庫(kù)。自定義 STUN/TURN 服務(wù)器配置WebRTC.Net 默認(rèn)使用 Google 的
  • 大廠卷向扁平化

    來(lái)源:新熵作者丨南枝 編輯丨月見(jiàn)大廠職級(jí)不香了。俗話說(shuō),兵無(wú)常勢(shì),水無(wú)常形,互聯(lián)網(wǎng)企業(yè)調(diào)整職級(jí)體系并不稀奇。7月13日,淘寶天貓集團(tuán)啟動(dòng)了近年來(lái)最大的人力制度改革,目前已形成一
  • 2納米決戰(zhàn)2025

    集微網(wǎng)報(bào)道 從三強(qiáng)爭(zhēng)霸到四雄逐鹿,2nm的廝殺聲已然隱約傳來(lái)。無(wú)論是老牌勁旅臺(tái)積電、三星,還是誓言重回先進(jìn)制程領(lǐng)先地位的英特爾,甚至初成立不久的新
  • DRAM存儲(chǔ)器10月價(jià)格下跌,NAND閃存本月價(jià)格與上月持平

    10月30日,據(jù)韓國(guó)媒體消息,自今年年初以來(lái)一直在上漲的 DRAM 存儲(chǔ)器的交易價(jià)格僅在本月就下跌了近 10%,此次是全年首次降價(jià),而NAND 閃存本月價(jià)格與上月持平。市
  • 華為舉行春季智慧辦公新品發(fā)布會(huì) 首次推出電子墨水屏平板

    北京時(shí)間2月27日晚,華為在巴塞羅那舉行春季智慧辦公新品發(fā)布會(huì),在海外市場(chǎng)推出之前已經(jīng)在中國(guó)市場(chǎng)上市的筆記本、平板、激光打印機(jī)等辦公產(chǎn)品,并首次推出搭載
  • 電博會(huì)上海爾智家模擬500平大平層,還原生活空間沉浸式體驗(yàn)

    電博會(huì)為了更好地讓參展觀眾真正感受到智能家居的絕妙之處,海爾智家的程傳嶺先生同樣介紹了展會(huì)上海爾智家的模擬500平大平層,還原生活空間沉浸式體驗(yàn)。程傳
Top