文件

快速開始

安裝 go-jwt、連線 Redis,並用 core 套件(goJwt)發出第一組 Token。

前置需求

安裝

使用 go get

go get github.com/pardnchiu/go-jwt

v1.0.3 之後的 import 路徑:

import goJwt "github.com/pardnchiu/go-jwt/core"

從原始碼

git clone https://github.com/pardnchiu/go-jwt.git
cd go-jwt
go build ./...

最小範例

package main

import (
    "log"
    "net/http"

    goJwt "github.com/pardnchiu/go-jwt/core"
)

func main() {
    jwtAuth, err := goJwt.New(goJwt.Config{
        Redis: goJwt.Redis{
            Host: "localhost",
            Port: 6379,
            DB:   0,
        },
    })
    if err != nil {
        log.Fatalf("init failed: %v", err)
    }
    defer jwtAuth.Close()

    http.HandleFunc("/login", func(w http.ResponseWriter, r *http.Request) {
        result := jwtAuth.Create(w, r, &goJwt.Auth{
            ID:    "user-1",
            Name:  "Alice",
            Email: "alice@example.com",
            Role:  "admin",
        })
        if !result.Success {
            http.Error(w, result.Error, result.StatusCode)
            return
        }
        w.WriteHeader(result.StatusCode)
    })

    log.Fatal(http.ListenAndServe(":8080", nil))
}

New 會載入或自動產生 ECDSA P-256 金鑰、ping Redis,並套用 Option 預設值(Access 15 分鐘、Refresh 7 天)。

保護路由(net/http)

mux := http.NewServeMux()
mux.Handle("/me", jwtAuth.HTTPMiddleware(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
    user, ok := goJwt.GetAuthDataFromHTTPRequest(r)
    if !ok {
        http.Error(w, "unauthorized", http.StatusUnauthorized)
        return
    }
    _ = user
})))

保護路由(Gin)

r := gin.Default()
auth := r.Group("/")
auth.Use(jwtAuth.GinMiddleware())
auth.GET("/me", func(c *gin.Context) {
    user, ok := goJwt.GetAuthDataFromGinContext(c)
    if !ok {
        c.JSON(http.StatusUnauthorized, gin.H{"error": "unauthorized"})
        return
    }
    c.JSON(http.StatusOK, user)
})

下一步

EN