【Go】TOKEN机制与跨域处理方式
package main
import (
"net/http"
"github.com/dgrijalva/jwt-go"
"github.com/gin-gonic/gin"
)
// 假设这是你的秘钥
var MySecret = []byte("我的秘钥")
// 创建Token
func CreateToken(userid string) (string, error) {
token := jwt.New(jwt.SigningMethodHS256)
claims := token.Claims.(jwt.MapClaims)
claims["userid"] = userid
claims["iss"] = "issuer" // 签发者
claims["exp"] = 1530000000 // 过期时间
tokenString, err := token.SignedString(MySecret)
if err != nil {
return "", err
}
return tokenString, nil
}
// 中间件,验证Token
func AuthMiddleware() gin.HandlerFunc {
return func(c *gin.Context) {
// 获取客户端传来的token
token := c.Request.Header.Get("token")
if token == "" {
c.JSON(http.StatusUnauthorized, gin.H{"code": 401, "message": "未登录"})
c.Abort()
return
}
// 解析token
claims, err := jwt.Parse(token, func(token *jwt.Token) (interface{}, error) {
return MySecret, nil
})
if err != nil || !claims.Valid {
c.JSON(http.StatusUnauthorized, gin.H{"code": 401, "message": "登录失效"})
c.Abort()
return
}
// 如果Token验证通过,则放行
c.Next()
}
}
func main() {
r := gin.Default()
// 处理跨域请求
r.Use(func(c *gin.Context) {
c.Writer.Header().Set("Access-Control-Allow-Origin", "*") // 允许任何源
c.Writer.Header().Set("Access-Control-Allow-Methods", "POST, GET, OPTIONS")
c.Writer.Header().Set("Access-Control-Allow-Headers", "Content-Type, token")
if c.Request.Method == "OPTIONS" {
c.AbortWithStatus(200)
} else {
c.Next()
}
})
// 使用中间件
r.Use(AuthMiddleware())
// 测试接口
r.GET("/hello", func(c *gin.Context) {
c.JSON(200, gin.H{"message": "Hello, World!"})
})
r.Run(":8080")
}
这段代码首先定义了一个秘钥,然后创建了一个创建Token的函数和一个中间件,用于验证Token。在中间件中,它会检查请求头中是否有Token,如果没有或Token无效,则返回未登录或登录失效的错误信息。在处理跨域请求时,它设置了正确的响应头,允许任何源、POST和GET方法以及Content-Type和token请求头。最后,在一个GET接口中,如果通过了中间件的验证,它将返回一个简单的JSON响应。
评论已关闭