Skip to content

Commit

Permalink
1.jwt模块新增MergeStandardClaims方法,2.swagger文档路由加入空配置判断
Browse files Browse the repository at this point in the history
  • Loading branch information
keepchen committed Aug 13, 2024
1 parent 5487e0b commit f48f0f3
Show file tree
Hide file tree
Showing 4 changed files with 82 additions and 9 deletions.
26 changes: 26 additions & 0 deletions lib/jwt/claims.go
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,9 @@ package jwt
import (
"fmt"
"strconv"
"time"

"github.com/google/uuid"

jwtLib "github.com/golang-jwt/jwt"
)
Expand Down Expand Up @@ -69,3 +72,26 @@ func (c *MapClaims) Valid() error {

return standardClaim.Valid()
}

// MergeStandardClaims
//
// 合并标准字段
//
// 如果传入的自定义字段在标准字段中存在,则用自定义字段覆盖标准字段
func MergeStandardClaims(fields map[string]interface{}) MapClaims {
now := time.Now()
defaultClaims := MapClaims{
"jti": uuid.New().String(),
"iat": now.Unix(),
"exp": now.Add(time.Hour * 24).Unix(),
"nbf": now.Unix(),
"iss": "Go-Sail",
}

//override
for k, v := range fields {
defaultClaims[k] = v
}

return defaultClaims
}
15 changes: 15 additions & 0 deletions lib/jwt/claims_test.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,15 @@
package jwt

import "testing"

func TestMergeStandardClaims(t *testing.T) {
fields := map[string]interface{}{
"uid": "1000",
"acc": "account-1000",
"jti": "AAA-BBB-CCC-DDD-EEE",
"iss": "A Inc.",
}
t.Log(MergeStandardClaims(fields))

t.Log(MergeStandardClaims(nil))
}
6 changes: 3 additions & 3 deletions sail/config/config.go
Original file line number Diff line number Diff line change
Expand Up @@ -36,9 +36,9 @@ type HttpServerConf struct {

type SwaggerConf struct {
Enable bool `yaml:"enable" toml:"enable" json:"enable" default:"false"` //是否启用
RedocUIPath string `yaml:"redoc_ui_path" toml:"redoc_ui_path" json:"redoc_ui_path"` //ui页面文件路径,如/path/to/docs.html,注意文件名必须是docs.html
JsonPath string `yaml:"json_path" toml:"json_path" json:"json_path"` //json文件路径
FaviconPath string `yaml:"favicon_path" toml:"favicon_path" json:"favicon_path"` //浏览器页签图标文件路径
RedocUIPath string `yaml:"redoc_ui_path" toml:"redoc_ui_path" json:"redoc_ui_path"` //ui页面文件路径,如 path/to/docs.html,注意文件名必须是docs.html
JsonPath string `yaml:"json_path" toml:"json_path" json:"json_path"` //json文件路径,如 path/to/swagger.json
FaviconPath string `yaml:"favicon_path" toml:"favicon_path" json:"favicon_path"` //浏览器页签图标文件路径,默认为go-sail图标
}

type PrometheusConf struct {
Expand Down
44 changes: 38 additions & 6 deletions sail/httpserver/swagger.go
Original file line number Diff line number Diff line change
@@ -1,6 +1,10 @@
package httpserver

import (
"encoding/base64"
"fmt"
"net/http"

"github.com/gin-gonic/gin"
"github.com/keepchen/go-sail/v3/sail/config"
swaggerFiles "github.com/swaggo/files"
Expand All @@ -17,14 +21,42 @@ func RunSwaggerServerWhenEnable(conf config.SwaggerConf, ginEngine *gin.Engine)
}

//swagger-ui
ginEngine.StaticFile("/swagger-assets/doc.json", conf.JsonPath)
url := ginSwagger.URL("/swagger-assets/doc.json") // The url pointing to API definition
//access /swagger/index.html
ginEngine.GET("/swagger/*any", ginSwagger.WrapHandler(swaggerFiles.Handler, url))
if len(conf.JsonPath) != 0 {
ginEngine.StaticFile("/swagger-assets/doc.json", conf.JsonPath)
url := ginSwagger.URL("/swagger-assets/doc.json") // The url pointing to API definition
//access /swagger/index.html
ginEngine.GET("/swagger/*any", ginSwagger.WrapHandler(swaggerFiles.Handler, url))
} else {
ginEngine.GET("/swagger/*any", func(c *gin.Context) {
c.String(http.StatusOK, "%s",
"Swagger UNAVAILABLE\n\nTroubleshooting:\n1.Set config variable: 'http_conf -> swagger_conf -> json_path'\n2.Restart server\n")
})
}

//redoc-ui
ginEngine.StaticFile("/redoc/docs.html", conf.RedocUIPath)
if len(conf.RedocUIPath) != 0 {
ginEngine.StaticFile("/redoc/docs.html", conf.RedocUIPath)
} else {
ginEngine.Any("/redoc/docs.html", func(c *gin.Context) {
c.String(http.StatusOK, "%s",
"Redoc UNAVAILABLE\n\nTroubleshooting:\n1.Set config variable: 'http_conf -> swagger_conf -> redoc_ui_path'\n2.Restart server\n")
})
}

//favicon
ginEngine.StaticFile("/favicon.ico", conf.FaviconPath)
if len(conf.FaviconPath) != 0 {
ginEngine.StaticFile("/favicon.ico", conf.FaviconPath)
} else {
ginEngine.GET("/favicon.ico", func(c *gin.Context) {
c.Writer.Header().Set("Content-Type", "image/x-icon")
c.Writer.Header().Set("Content-Length", fmt.Sprintf("%d", len(defaultLogoBytes)))
_, _ = c.Writer.Write(defaultLogoBytes)
})
}
}

// @ref https://github.com/keepchen/go-sail/blob/main/static/sailboat-solid-colorful.png
// local: static/sailboat-solid-colorful.png
const defaultLogoBase64 = "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"

var defaultLogoBytes, _ = base64.StdEncoding.DecodeString(defaultLogoBase64)

0 comments on commit f48f0f3

Please sign in to comment.