refactor(auth): replace dashboard sessions with stateless tokens and session control (#6329)

* refactor(auth): replace dashboard sessions with stateless tokens

* feat(auth): harden session issuance and distributed enforcement

* fix(proxy): preserve trusted proxy compatibility defaults

* refactor: address dashboard auth review feedback

* refactor: remove classic frontend and flatten web app
This commit is contained in:
Calcium-Ion
2026-07-20 16:48:43 +08:00
committed by GitHub
parent 5a6c53d496
commit 31d70fca39
1605 changed files with 17511 additions and 147913 deletions
+16 -28
View File
@@ -32,26 +32,18 @@ import (
"github.com/QuantumNous/new-api/setting/ratio_setting"
"github.com/bytedance/gopkg/util/gopool"
"github.com/gin-contrib/sessions"
"github.com/gin-contrib/sessions/cookie"
"github.com/gin-gonic/gin"
"github.com/joho/godotenv"
_ "net/http/pprof"
)
//go:embed web/default/dist
//go:embed web/dist
var buildFS embed.FS
//go:embed web/default/dist/index.html
//go:embed web/dist/index.html
var indexPage []byte
//go:embed web/classic/dist
var classicBuildFS embed.FS
//go:embed web/classic/dist/index.html
var classicIndexPage []byte
func main() {
startTime := time.Now()
@@ -173,6 +165,10 @@ func main() {
// Initialize HTTP server
server := gin.New()
if err := configureTrustedProxies(server); err != nil {
common.FatalLog("failed to configure trusted proxies: " + err.Error())
return
}
server.Use(gin.CustomRecovery(func(c *gin.Context, err any) {
common.SysLog(fmt.Sprintf("panic detected: %v", err))
c.JSON(http.StatusInternalServerError, gin.H{
@@ -188,26 +184,13 @@ func main() {
server.Use(middleware.Version())
server.Use(middleware.I18n())
middleware.SetUpLogger(server)
// Initialize session store
store := cookie.NewStore([]byte(common.SessionSecret))
store.Options(sessions.Options{
Path: "/",
MaxAge: 2592000, // 30 days
HttpOnly: true,
Secure: common.SessionCookieSecure,
SameSite: http.SameSiteStrictMode,
})
server.Use(sessions.Sessions("session", store))
InjectUmamiAnalytics()
InjectGoogleAnalytics()
// 设置路由
router.SetRouter(server, router.ThemeAssets{
DefaultBuildFS: buildFS,
DefaultIndexPage: indexPage,
ClassicBuildFS: classicBuildFS,
ClassicIndexPage: classicIndexPage,
router.SetRouter(server, router.WebAssets{
BuildFS: buildFS,
IndexPage: indexPage,
})
var port = os.Getenv("PORT")
if port == "" {
@@ -266,7 +249,6 @@ func InjectUmamiAnalytics() {
analyticsInject := []byte(analyticsInjectBuilder.String())
placeholder := []byte("<!--umami-->\n")
indexPage = bytes.ReplaceAll(indexPage, placeholder, analyticsInject)
classicIndexPage = bytes.ReplaceAll(classicIndexPage, placeholder, analyticsInject)
}
func InjectGoogleAnalytics() {
@@ -290,7 +272,6 @@ func InjectGoogleAnalytics() {
analyticsInject := []byte(analyticsInjectBuilder.String())
placeholder := []byte("<!--Google Analytics-->\n")
indexPage = bytes.ReplaceAll(indexPage, placeholder, analyticsInject)
classicIndexPage = bytes.ReplaceAll(classicIndexPage, placeholder, analyticsInject)
}
func InitResources() error {
@@ -329,6 +310,11 @@ func InitResources() error {
model.CheckSetup()
// Initialize options, should after model.InitDB()
if common.IsMasterNode {
if err := model.MigrateRetiredFrontendOptions(); err != nil {
common.SysError("failed to migrate retired frontend options: " + err.Error())
}
}
model.InitOptionMap()
// 清理旧的磁盘缓存文件
@@ -369,5 +355,7 @@ func InitResources() error {
// Don't return error, custom OAuth is not critical
}
service.StartAuthArtifactCleanup()
return nil
}