- 公网反代:Nginx 状态卡片(版本 / 运行状态 / 配置校验 / 端口监听) - 部署设置第一、二梯队(HTTPS 开关、安全头、限流、连接数、仅中国大陆 IP) - 隧道检测兼容 frps v0.68 / v0.71(V2 与旧版端点) - 恢复被清空的 internal/frp/store.go、internal/api/ddns_handler.go、web/src/views/DdnsView.vue
44 lines
1.1 KiB
Go
44 lines
1.1 KiB
Go
package api
|
|
|
|
import (
|
|
"context"
|
|
"net/http"
|
|
|
|
"github.com/fonu/fonu/internal/auth"
|
|
)
|
|
|
|
type contextKey string
|
|
|
|
const sessionContextKey contextKey = "session_id"
|
|
|
|
func SessionMiddleware(authSvc *auth.Service) func(http.Handler) http.Handler {
|
|
return func(next http.Handler) http.Handler {
|
|
return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
|
|
cookie, err := r.Cookie("fonu_session")
|
|
if err == nil && cookie.Value != "" {
|
|
ctx := context.WithValue(r.Context(), sessionContextKey, cookie.Value)
|
|
r = r.WithContext(ctx)
|
|
}
|
|
next.ServeHTTP(w, r)
|
|
})
|
|
}
|
|
}
|
|
|
|
func RequireAuth(authSvc *auth.Service) func(http.Handler) http.Handler {
|
|
return func(next http.Handler) http.Handler {
|
|
return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
|
|
sessionID, _ := r.Context().Value(sessionContextKey).(string)
|
|
if err := authSvc.ValidateSession(r.Context(), sessionID); err != nil {
|
|
writeError(r, w, http.StatusUnauthorized, "未登录或会话已过期")
|
|
return
|
|
}
|
|
next.ServeHTTP(w, r)
|
|
})
|
|
}
|
|
}
|
|
|
|
func sessionIDFromContext(ctx context.Context) string {
|
|
v, _ := ctx.Value(sessionContextKey).(string)
|
|
return v
|
|
}
|