74 lines
1.6 KiB
Go
74 lines
1.6 KiB
Go
|
package apis
|
||
|
|
||
|
import (
|
||
|
"context"
|
||
|
"net/http"
|
||
|
"path/filepath"
|
||
|
"strings"
|
||
|
|
||
|
"github.com/go-chi/chi/v5/middleware"
|
||
|
"github.com/go-chi/render"
|
||
|
"github.com/google/uuid"
|
||
|
|
||
|
"git.ifooth.com/common/pkg/apis/rest"
|
||
|
"git.ifooth.com/common/pkg/components"
|
||
|
)
|
||
|
|
||
|
// RequestIdGenerator request_id
|
||
|
func RequestIdGenerator() string {
|
||
|
uid := uuid.New().String()
|
||
|
requestId := strings.Replace(uid, "-", "", -1)
|
||
|
return requestId
|
||
|
}
|
||
|
|
||
|
// RequestID reuqest_id
|
||
|
func RequestID(next http.Handler) http.Handler {
|
||
|
fn := func(w http.ResponseWriter, r *http.Request) {
|
||
|
ctx := r.Context()
|
||
|
requestID := r.Header.Get(components.RequestIDHeaderKey)
|
||
|
if requestID == "" {
|
||
|
requestID = RequestIdGenerator()
|
||
|
}
|
||
|
|
||
|
ctx = components.WithRequestIDValue(ctx, requestID)
|
||
|
ctx = context.WithValue(ctx, middleware.RequestIDKey, requestID)
|
||
|
|
||
|
w.Header().Set(components.RequestIDHeaderKey, requestID)
|
||
|
next.ServeHTTP(w, r.WithContext(ctx))
|
||
|
}
|
||
|
return http.HandlerFunc(fn)
|
||
|
}
|
||
|
|
||
|
// AuthRequired API类型, 兼容多种鉴权模式
|
||
|
func AuthRequired(next http.Handler) http.Handler {
|
||
|
ignoreExtMap := map[string]struct{}{
|
||
|
".js": {},
|
||
|
".css": {},
|
||
|
".map": {},
|
||
|
".png": {},
|
||
|
}
|
||
|
|
||
|
fn := func(w http.ResponseWriter, r *http.Request) {
|
||
|
if r.Method == http.MethodOptions {
|
||
|
next.ServeHTTP(w, r)
|
||
|
return
|
||
|
}
|
||
|
|
||
|
// 静态资源过滤, 注意不会带鉴权信息
|
||
|
fileExt := filepath.Ext(r.URL.Path)
|
||
|
if _, ok := ignoreExtMap[fileExt]; ok {
|
||
|
next.ServeHTTP(w, r)
|
||
|
return
|
||
|
}
|
||
|
|
||
|
switch {
|
||
|
default:
|
||
|
render.Render(w, r, rest.AbortWithUnauthorizedError(rest.UnauthorizedError))
|
||
|
return
|
||
|
}
|
||
|
|
||
|
next.ServeHTTP(w, r)
|
||
|
}
|
||
|
return http.HandlerFunc(fn)
|
||
|
}
|