參考:https://jwt.io/introduction/
江川ssl適用于網(wǎng)站、小程序/APP、API接口等需要進行數(shù)據(jù)傳輸應(yīng)用場景,ssl證書未來市場廣闊!成為創(chuàng)新互聯(lián)的ssl證書銷售渠道,可以享受市場價格4-6折優(yōu)惠!如果有意向歡迎電話聯(lián)系或者加微信:13518219792(備注:SSL證書合作)期待與您的合作!該單點登錄是基于Go語言實現(xiàn)的單點登錄系統(tǒng),下面先簡單介紹JWT
JWT是一個開放的標準(RFC 7519),它定義了一個緊湊且自包含的方式,用于在各方之間以JSON對象安全地傳輸信息.這些信息可以通過數(shù)字簽名進行驗證和信任??梢允褂妹孛埽ㄊ褂肏MAC算法)或使用RSA的公鑰/私鑰對來對JWT進行簽名。
緊湊:由于它們尺寸較小,JWT可以通過URL,POST參數(shù)或HTTP頭內(nèi)發(fā)送。另外,尺寸越小意味著傳輸速度越快。
自包含:有效載荷包含有關(guān)用戶的所有必需信息,避免了多次查詢數(shù)據(jù)庫的需要。
身份驗證(Authentication):這是使用JWT最常見的情況。一旦用戶登錄,每個后續(xù)請求將包括JWT,允許用戶訪問該令牌允許的路由,服務(wù)和資源。單點登錄是目前廣泛使用JWT的一項功能,因為它的開銷很小,而且能夠輕松地在不同的域中使用。
信息交換:JSON Web Tokens是在各方之間安全傳輸信息的好方法。因為JWT可以被簽名,例如使用公鑰/私鑰對,所以你可以確定發(fā)件人是他們說的那個人。此外,由于使用標頭、有效載荷、計算簽名,因此您還可以驗證內(nèi)容是否未被篡改。
JSON Web Tokens包含三個由點(.)分隔的部分,它們是:頭部、有效載荷、簽名
JWT通常看起來如下所示。
xxxxx.yyyyy.zzzzz
頭部通常由兩部分組成:令牌的類型(即JWT)和正在使用的散列算法(the hashing algorithm 如HMAC SHA256或RSA)。
例如:
{
"alg": "HS256",
"typ": "JWT"
}
然后,這個JSON被Base64Url編碼,形成JWT的第一部分。
令牌的第二部分是包含聲明的有效載荷。 聲明是關(guān)于實體(通常是用戶)和附加元數(shù)據(jù)的聲明。 有三種類型的聲明:保留,公開和私有聲明。
保留的聲明(Reserved claims):這是一組預先定義的聲明,不是強制性的,但推薦使用,以提供一組有用的,可互操作的聲明。 其中一些是:iss(發(fā)行人),exp(到期時間),sub(主題),aud(聽眾)等等。
請注意,聲明名稱只有三個字符長,因為JWT是緊湊的。
公開聲明(Public claims):這些可以由使用JWT的人員任意定義。 但為避免沖突,應(yīng)在IANA JSON Web令牌注冊表中定義它們,或者將其定義為包含防沖突命名空間的URI。
私有聲明(Private claims):這是為了同意使用它們的各方之間共享信息而創(chuàng)建的自定義claims。
有效載荷的一個例子可以是:
{
"sub": "1234567890",
"name": "John Doe",
"admin": true
}
然后將有效載荷Base64Url進行編碼,以形成JSON Web令牌的第二部分。
要創(chuàng)建簽名部分,您必須采用編碼頭部,編碼有效載荷,密鑰,頭部中指定的算法并簽名。
例如,如果您想使用HMAC SHA256算法,簽名將按以下方式創(chuàng)建:
HMACSHA256(
base64UrlEncode(header) + "." +
base64UrlEncode(payload),
secret)
簽名用于驗證JWT的發(fā)件人是誰,并確保郵件在一路上沒有改變。
輸出是三個由點分隔的Base64字符串,可以輕松地在HTML和HTTP環(huán)境中傳遞,而與基于XML的標準(如SAML)相比,它更加緊湊。
下面顯示了一個JWT,它具有先前的頭部和有效載荷編碼,并且用秘密簽名。
在身份驗證中(authentication),當用戶使用他們的憑證(credentials)成功登錄時,將返回一個JSON Web Token,并且必須保存在本地(通常在本地存儲中,但也可以使用Cookie),而不是在傳統(tǒng)方法中創(chuàng)建會話 服務(wù)器并返回一個cookie。
無論何時用戶想要訪問受保護的路由或資源,用戶代理都應(yīng)發(fā)送JWT,通常在Authorization頭部的Bearer模式中。 頭部的內(nèi)容應(yīng)該如下所示:
Authorization: Bearer <token>
這是一種無狀態(tài)身份驗證機制,因為用戶狀態(tài)永遠不會保存在服務(wù)器內(nèi)存中。 服務(wù)器的受保護路由將在授權(quán)頭中檢查有效的JWT,如果存在,則允許用戶訪問受保護的資源。 由于JWT是獨立的,所有必要的信息都在那里,減少了多次查詢數(shù)據(jù)庫的需求。
這使您可以完全依賴無狀態(tài)的數(shù)據(jù)API,甚至向下游服務(wù)發(fā)出請求。 無論哪個域正在為您的API提供服務(wù),跨源資源共享(CORS)將不會成為問題,因為它不使用cookie。
下圖顯示了這個過程:
讓我們來談?wù)勁c簡單Web令牌(SWT)和安全聲明標記語言令牌(SAML)相比,JSON Web令牌(JWT)的好處。
由于JSON不如XML冗長,所以在進行編碼時,它的大小也會變小,從而使JWT比SAML更緊湊。這使得JWT成為在HTML和HTTP環(huán)境中傳遞的一個很好的選擇。
安全方面,SWT只能通過使用HMAC算法的共享秘密進行對稱簽名。但是,JWT和SAML令牌可以使用X.509證書形式的公鑰/私鑰對進行簽名。與簽署JSON的簡單性相比,使用XML數(shù)字簽名簽署XML而不引入模糊的安全漏洞是非常困難的。
JSON解析器在大多數(shù)編程語言中都很常見,因為它們直接映射到對象。相反,XML沒有自然的文檔到對象映射。這使得使用JWT比SAML斷言更容易。
關(guān)于使用情況,JWT在互聯(lián)網(wǎng)上使用。這突出顯示了在多個平臺(尤其是移動平臺)上JSON Web令牌的客戶端處理的簡易性。
支持手機號碼+驗證碼、郵箱+驗證碼、微信第三方授權(quán)三種方式注冊
支持手機號碼、用戶名、郵箱號碼、微信登錄
支持手機和郵箱找回密碼
支持阿里云通信和互億無線的短信驗證碼服務(wù)
代碼路徑:https://github.com/KenmyZhang/single-sign-on
package api
import (
"net/http"
"regexp"
"strconv"
"fmt"
l4g "github.com/alecthomas/log4go"
"github.com/KenmyZhang/single-sign-on/app"
"github.com/KenmyZhang/single-sign-on/model"
"github.com/KenmyZhang/single-sign-on/utils"
"github.com/KenmyZhang/single-sign-on/sqlStore"
)
func InitUser() {
l4g.Debug(utils.T("api.user.init.debug"))
BaseRoutes.User.Handle("", ApiCustomClaimsRequired(getUser)).Methods("GET")
BaseRoutes.User.Handle("/image", ApiHandler(getProfileImage)).Methods("GET")
BaseRoutes.User.Handle("/image", ApiCustomClaimsRequired(setProfileImage)).Methods("POST")
BaseRoutes.Users.Handle("/login", ApiHandler(login)).Methods("POST")
BaseRoutes.Users.Handle("/logout", ApiHandler(logout)).Methods("POST")
BaseRoutes.Users.Handle("/sendsms", ApiHandler(sendSmsCode)).Methods("POST")
BaseRoutes.Users.Handle("/phone/signup", ApiHandler(signupByMobile)).Methods("POST")
BaseRoutes.Users.Handle("/phone/login", ApiHandler(loginByMobile)).Methods("POST")
BaseRoutes.Users.Handle("/phone/exist", ApiHandler(isMobileExist)).Methods("POST")
BaseRoutes.Users.Handle("/phone/reset", ApiHandler(resetPasswordByMobile)).Methods("POST")
BaseRoutes.Users.Handle("/email/verify/code/send", ApiHandler(sendVerificationCodeEmail)).Methods("POST")
BaseRoutes.Users.Handle("/email/signup", ApiHandler(signupByEmail)).Methods("POST")
BaseRoutes.Users.Handle("/email/exist", ApiHandler(isEmailExist)).Methods("POST")
BaseRoutes.Users.Handle("/email/reset", ApiHandler(resetPasswordByEmail)).Methods("POST")
BaseRoutes.Users.Handle("/search", ApiCustomClaimsRequired(searchUsers)).Methods("POST")
}
......
推薦一篇文章
https://www.cnblogs.com/lyzg/p/6132801.html
https://studygolang.com/articles/11793
另外有需要云服務(wù)器可以了解下創(chuàng)新互聯(lián)scvps.cn,海內(nèi)外云服務(wù)器15元起步,三天無理由+7*72小時售后在線,公司持有idc許可證,提供“云服務(wù)器、裸金屬服務(wù)器、高防服務(wù)器、香港服務(wù)器、美國服務(wù)器、虛擬主機、免備案服務(wù)器”等云主機租用服務(wù)以及企業(yè)上云的綜合解決方案,具有“安全穩(wěn)定、簡單易用、服務(wù)可用性高、性價比高”等特點與優(yōu)勢,專為企業(yè)上云打造定制,能夠滿足用戶豐富、多元化的應(yīng)用場景需求。
分享名稱:基于Go語言實現(xiàn)的單點登錄系統(tǒng)-創(chuàng)新互聯(lián)
URL標題:http://aaarwkj.com/article6/ccjhig.html
成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供微信公眾號、全網(wǎng)營銷推廣、品牌網(wǎng)站制作、網(wǎng)站收錄、標簽優(yōu)化、ChatGPT
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時需注明來源: 創(chuàng)新互聯(lián)
猜你還喜歡下面的內(nèi)容