This commit implements a full-stack authentication system using JWT. On the backend, a new login endpoint `/api/token` is created. It validates credentials and issues a signed JWT. A JWT middleware is added to the server configuration to protect sensitive API endpoints like `/api/category` and `/api/operation`. Configuration is now managed via a `wallet.conf` file, loaded at startup. On the frontend, this enables a complete authentication lifecycle: - A new `/login` page allows users to enter their credentials. - A `PrivateRoute` component wraps protected pages, redirecting unauthenticated users to the login page. - API calls to protected resources now include the `Authorization: Bearer <token>` header. - A logout function is added to clear user session data. refactor(ui): enhance history and category views This commit also introduces major UI improvements. The History modal has been completely redesigned. Operations are no longer displayed as a flat list but are now grouped into tabs for Daily, Weekly, Monthly, and Yearly views, providing a much clearer overview of transactions. The Categories modal now separates categories into "Incomes" and "Expenses" tabs, reflecting the changes in the backend data model.
38 lines
924 B
Go
38 lines
924 B
Go
package server
|
|
|
|
import (
|
|
"backend/api"
|
|
"backend/utils"
|
|
"os"
|
|
|
|
jwtware "github.com/gofiber/contrib/jwt"
|
|
"github.com/gofiber/fiber/v2"
|
|
"github.com/gofiber/fiber/v2/log"
|
|
"github.com/gofiber/fiber/v2/middleware/cors"
|
|
)
|
|
|
|
func Configure(app *fiber.App) {
|
|
utils.LoadEnv("wallet.conf")
|
|
log.SetLevel(log.LevelDebug)
|
|
app.Use(cors.New(cors.Config{
|
|
AllowOrigins: "http://localhost:3000",
|
|
AllowHeaders: "*",
|
|
}))
|
|
app.Static("/", "../frontend/build")
|
|
apiGroup := app.Group("/api")
|
|
|
|
apiGroup.Post("/token", api.Login)
|
|
apiGroup.Get("/accessible", api.Accessible)
|
|
app.Use(jwtware.New(jwtware.Config{
|
|
SigningKey: jwtware.SigningKey{
|
|
Key: []byte(os.Getenv("JWT_SECRET_KEY")),
|
|
},
|
|
}))
|
|
apiGroup.Get("/rescticted", api.Restricted)
|
|
operationGroup := apiGroup.Group("/operation")
|
|
operationGroup.Get("/", api.GetAllOperation)
|
|
|
|
categoryGroup := apiGroup.Group("/category")
|
|
categoryGroup.Get("/", api.GetAllCategories)
|
|
}
|