JSON Web Token(JWT)是一种开放标准(RFC 7519),它定义了一种紧凑且自包含的方式,用于在各方之间以 JSON 对象安全地传输信息。该信息通过数字签名进行验证和信任。JWT 通常用于身份验证和信息交换,在 Web 开发中被广泛使用,Golang是当前比较流行的一种开发语言,所以在Golang中实现JWT是一个常见的业务场景。
文章目录
在 Golang 中实现 JWT,我们可以使用社区广泛使用的库 github.com/dgrijalva/jwt-go。该库提供了生成和验证 JWT 的简单方法。
首先,我们需要安装 jwt-go 库:
go get github.com/dgrijalva/jwt-go
下面是一个生成 JWT 的简单示例:
package main
import (
"fmt"
"time"
"github.com/dgrijalva/jwt-go"
)
func main() {
// 创建一个新的 token 对象,指定签名方法和 claims
token := jwt.NewWithClaims(jwt.SigningMethodHS256, jwt.MapClaims{
"name": "John Doe",
"admin": true,
"exp": time.Now().Add(time.Hour * 72).Unix(),
})
// 使用密钥字符串对 token 对象进行签名,并获得完整的编码后的 token 字符串
tokenString, err := token.SignedString([]byte("your-256-bit-secret"))
if err != nil {
fmt.Println(err)
return
}
fmt.Println("Generated Token: ", tokenString)
}
验证 JWT 也非常简单:
package main
import (
"fmt"
"github.com/dgrijalva/jwt-go"
)
func main() {
tokenString := "your.jwt.token"
// 解析 token
token, err := jwt.Parse(tokenString, func(token *jwt.Token) (interface{}, error) {
// 确保 token 使用的是我们期望的签名方法
if _, ok := token.Method.(*jwt.SigningMethodHMAC); !ok {
return nil, fmt.Errorf("unexpected signing method: %v", token.Header["alg"])
}
// 返回用于签名的密钥
return []byte("your-256-bit-secret"), nil
})
if claims, ok := token.Claims.(jwt.MapClaims); ok && token.Valid {
fmt.Println("Name: ", claims["name"])
fmt.Println("Admin: ", claims["admin"])
} else {
fmt.Println(err)
}
}
Authorization
头部发送给服务器。服务器接收到请求后,验证 JWT 的有效性,并根据 JWT 中的声明信息进行权限控制。package main
import (
"net/http"
"time"
"github.com/dgrijalva/jwt-go"
"encoding/json"
)
var mySigningKey = []byte("your-256-bit-secret")
func loginHandler(w http.ResponseWriter, r *http.Request) {
// 假设用户名和密码验证成功
token := jwt.NewWithClaims(jwt.SigningMethodHS256, jwt.MapClaims{
"name": "John Doe",
"admin": true,
"exp": time.Now().Add(time.Hour * 72).Unix(),
})
tokenString, err := token.SignedString(mySigningKey)
if err != nil {
http.Error(w, err.Error(), http.StatusInternalServerError)
return
}
json.NewEncoder(w).Encode(map[string]string{"token": tokenString})
}
func main() {
http.HandleFunc("/login", loginHandler)
http.ListenAndServe(":8080", nil)
}
package main
import (
"net/http"
"fmt"
"github.com/dgrijalva/jwt-go"
)
var mySigningKey = []byte("your-256-bit-secret")
func authMiddleware(next http.Handler) http.Handler {
return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
tokenString := r.Header.Get("Authorization")
if tokenString == "" {
http.Error(w, "Authorization header missing", http.StatusUnauthorized)
return
}
token, err := jwt.Parse(tokenString, func(token *jwt.Token) (interface{}, error) {
if _, ok := token.Method.(*jwt.SigningMethodHMAC); !ok {
return nil, fmt.Errorf("unexpected signing method: %v", token.Header["alg"])
}
return mySigningKey, nil
})
if err != nil || !token.Valid {
http.Error(w, "Invalid token", http.StatusUnauthorized)
return
}
next.ServeHTTP(w, r)
})
}
func protectedHandler(w http.ResponseWriter, r *http.Request) {
fmt.Fprintf(w, "This is a protected endpoint")
}
func main() {
http.Handle("/protected", authMiddleware(http.HandlerFunc(protectedHandler)))
http.ListenAndServe(":8080", nil)
}
在实际应用中,JWT 可以用于身份验证和信息交换,确保传输数据的安全性和完整性。
绿灯VPN使用指南:科学上网,保护隐私深入了解shadowsocks win64 1.6蜜蜂v2ray:一种更安全的VPN选择Wilson Clash Blade对比Mac如何配置v2rayv2ray找不到core问题解决GCP V2Ray BBR使用教程与常见问题解答Shadowsocks安卓版GitHub获取及使用教程VPN连接问题解决方法-VPN YouTube打不开怎么办v2ray_switch.tar.gz:全面教程与安装指南大西北崛起!新能源汽车第一城易主,上海被取代如何免费使用clashSina App Engine翻墙使用教程Shadowsocks Windows客户端下载教程Clash自动测速规则:使用方法与常见问题解答机场测速 [SS/SSR/V2Ray/Trojan] 【电信】纯测速图 更新中centos 7 远程 ssh connection refused解决办法大全Quantumult X (圈叉) 最新懒人图文教程白月光机场发布旧不限时流量包套餐调整通知全节点 IPLC 专线机场高性价比机场推荐: Gatern 机场怎么样?流媒体解锁,小众节点多