golang举办复杂权限认证的完成

时尚 · 2026-09-22 21:34:09

独霸JWT举办认证

JSON Web Tokens (JWT) are 举办a more modern approach to authentication.

As the web moves to a greater separation between the client and server, JWT provides a wonderful alternative to traditional cookie based authentication models.

JWTs provide a way for clients to authenticate every request without having to maintain a session or repeatedly pass login credentials to the server.

用户注册此后, 处事器生成一个 JWT token前去给不雅不雅不雅不雅鉴赏器, 不雅不雅不雅不雅鉴赏器向处事器请求数据时将 JWT token 发给处事器, 处事器用 signature 中定义的编制解码

JWT 掉落踪掉落踪用户信息.

一个 JWT token包含3部分:
1 header: 陈述我们独霸的算法和 token 圭表类型
2 Payload: 必须独霸 sub key 来指定用户 ID, 还可以包含其他信息比如 email, username 等.
3 Signature: 用来担保 JWT 的真实性. 可独霸不合算法

package mainimport (	"encoding/json"	"fmt"	"log"	"net/http"	"strings"	"time"	"github.com/codegangsta/negroni"	"github.com/dgrijalva/jwt-go"	"github.com/dgrijalva/jwt-go/request")const (	SecretKey = "welcome ---------")func fatal(err error) { 	if err != nil { 		log.Fatal(err)	}}type UserCredentials struct { 	Username string `json:"username"`	Password string `json:"password"`}type User struct { 	ID       int    `json:"id"`	Name     string `json:"name"`	Username string `json:"username"`	Password string `json:"password"`}type Response struct { 	Data string `json:"data"`}type Token struct { 	Token string `json:"token"`}func StartServer() { 	http.HandleFunc("/login", LoginHandler)	http.Handle("/resource", negroni.New(		negroni.HandlerFunc(ValidateTokenMiddleware),		negroni.Wrap(http.HandlerFunc(ProtectedHandler)),	))	log.Println("Now listening...")	http.ListenAndServe(":8087", nil)}func main() { 	StartServer()}func ProtectedHandler(w http.ResponseWriter, r *http.Request) { 	response := Response{ "Gained access to protected resource"}	JsonResponse(response, w)}func LoginHandler(w http.ResponseWriter, r *http.Request) { 	var user UserCredentials	err := json.NewDecoder(r.Body).Decode(&user)	if err != nil { 		w.WriteHeader(http.StatusForbidden)		fmt.Fprint(w, "Error in request")		return	}	if strings.ToLower(user.Username) != "someone" { 		if user.Password != "p@ssword" { 			w.WriteHeader(http.StatusForbidden)			fmt.Println("Error logging in")			fmt.Fprint(w, "Invalid credentials")			return		}	}	token := jwt.New(jwt.SigningMethodHS256)	claims := make(jwt.MapClaims)	claims["exp"] = time.Now().Add(time.Hour * time.Duration(1)).Unix()	claims["iat"] = time.Now().Unix()	token.Claims = claims	if err != nil { 		w.WriteHeader(http.StatusInternalServerError)		fmt.Fprintln(w, "Error extracting the key")		fatal(err)	}	tokenString, err := token.SignedString([]byte(SecretKey))	if err != nil { 		w.WriteHeader(http.StatusInternalServerError)		fmt.Fprintln(w, "Error while signing the token")		fatal(err)	}	response := Token{ tokenString}	JsonResponse(response, w)}func ValidateTokenMiddleware(w http.ResponseWriter, r *http.Request, next http.HandlerFunc) { 	token, err := request.ParseFromRequest(r, request.AuthorizationHeaderExtractor,		func(token *jwt.Token) (inte***ce{ }, error) { 			return []byte(SecretKey), nil		})	if err == nil { 		if token.Valid { 			next(w, r)		} else { 			w.WriteHeader(http.StatusUnauthorized)			fmt.Fprint(w, "Token is not valid")		}	} else { 		w.WriteHeader(http.StatusUnauthorized)		fmt.Fprint(w, "Unauthorized access to this resource")	}}func JsonResponse(response inte***ce{ }, w http.ResponseWriter) { 	json, err := json.Marshal(response)	if err != nil { 		http.Error(w, err.Error(), http.StatusInternalServerError)		return	}	w.WriteHeader(http.StatusOK)	w.Header().Set("Content-Type", "application/json")	w.Write(json)}

在这里拔出图片描摹

在这里拔出图片描摹

到此这篇关于golang举办复杂权限认证的完成的文章就引见到这了,更多相干Golang 权限认证内容请搜刮完竣下载之前的文章或延续不雅不雅不雅不雅鉴赏上面的相干文章希看大年夜师往后多多支撑完竣下载 !

复杂

文章推荐:

崩坏星穹铁道茶百道联动甚么时辰最早

扬州国资国企“十五五”残局见实见新 五维发力释放高质量展开强旗子记号

前7月广州国际港中欧班列发运标箱数同比增16.4%

财务部修订印发《企业司帐绳尺第30号——财务报表列报》

原神风龙废墟最高处风神瞳群集攻略

8月5日“农产品零售价值200指数”比昨天上升0.07个点

在消费中感知中国生永活力(国际不美不雅不雅不雅不雅不雅不雅澜)

2026年上半年我国黄金产量152.908吨 同比降低14.62%

美版黑解iphone和国版有甚么分辨

年中经济不雅不雅不雅不雅不雅不雅不雅不雅不雅不雅不雅不雅不雅不雅不雅不雅查询拜访丨多方合力 广西横州茉莉花财富链灾后包抄

商务部 :对美国合规性测试公司采取反制编制

A股延续两日下跌 贵金属板块走强

热门浏览

标签列表