diff --git a/api/auth/token.go b/api/auth/token.go new file mode 100644 index 0000000..39ed234 --- /dev/null +++ b/api/auth/token.go @@ -0,0 +1,43 @@ +package auth + +import ( + "auth_service/api/jwt" + "auth_service/database" + "auth_service/model" + "encoding/json" + "fmt" + "net/http" + "time" +) + +func Token(w http.ResponseWriter, req *http.Request) { + w.Header().Set("Content-Type", "application/json") + var request model.TokenRequest + decoder := json.NewDecoder(req.Body) + decoder.Decode(&request) + dbuser, e := database.GetUserByUsername(request.Username) + if e != nil { + fmt.Fprintf(w, "{\"status\":403,\"error\":\"%v\"}", e) + return + } + if dbuser.Password == request.Password { + responseUser := model.UserResponse{ + Id: dbuser.Id, + Username: dbuser.Username, + Email: dbuser.Email, + Group: dbuser.Group, + IsSuperuser: dbuser.IsSuperuser, + } + responseUserMarshal, _ := json.Marshal(responseUser) + responseUserUnmarshal := make(map[string]any) + json.Unmarshal(responseUserMarshal, &responseUserUnmarshal) + token, _ := jwt.CreateJWT( + jwt.Defaultsecretkey, + responseUserUnmarshal, + time.Duration(24*time.Hour), + ) + fmt.Fprintf(w, "{\"token\":\"%s\"}", token) + return + } + fmt.Fprintf(w, "{\"status\":\"403\"}") +} diff --git a/api/auth/verify.go b/api/auth/verify.go new file mode 100644 index 0000000..6b1f3f5 --- /dev/null +++ b/api/auth/verify.go @@ -0,0 +1,22 @@ +package auth + +import ( + "auth_service/api/jwt" + "auth_service/model" + "encoding/json" + "fmt" + "net/http" +) + +func VerifyToken(w http.ResponseWriter, req *http.Request) { + w.Header().Set("Content-Type", "application/json") + var request model.Token + decoder := json.NewDecoder(req.Body) + decoder.Decode(&request) + _, e := jwt.VerifyJWT(request.Token, jwt.Defaultsecretkey) + if e != nil { + fmt.Fprintf(w, "{\"status\":403}") + return + } + fmt.Fprintf(w, "{\"status\":200}") +} diff --git a/api/jwt/create.go b/api/jwt/create.go new file mode 100644 index 0000000..ef83174 --- /dev/null +++ b/api/jwt/create.go @@ -0,0 +1,27 @@ +package jwt + +import ( + "maps" + "time" + + "github.com/golang-jwt/jwt" +) + +func CreateJWT( + secretKey string, + data map[string]any, + ttl time.Duration, +) (string, error) { + claims := jwt.MapClaims{ + "exp": time.Now().Add(ttl).Unix(), + "iat": time.Now().Unix(), + "nbf": time.Now().Unix(), + } + maps.Copy(claims, data) + token := jwt.NewWithClaims(jwt.SigningMethodHS256, claims) + signedToken, err := token.SignedString([]byte(secretKey)) + if err != nil { + return "", nil + } + return signedToken, nil +} diff --git a/api/jwt/jwt.go b/api/jwt/jwt.go new file mode 100644 index 0000000..7d3b72f --- /dev/null +++ b/api/jwt/jwt.go @@ -0,0 +1,3 @@ +package jwt + +const Defaultsecretkey = "secret" diff --git a/api/jwt/verify.go b/api/jwt/verify.go new file mode 100644 index 0000000..a5a51a3 --- /dev/null +++ b/api/jwt/verify.go @@ -0,0 +1,39 @@ +package jwt + +import ( + "fmt" + + "github.com/golang-jwt/jwt" +) + +func VerifyJWT( + tokenString string, + secretKey string, +) (map[string]any, error) { + token, e := jwt.Parse( + tokenString, + func(token *jwt.Token) (any, error) { + if _, ok := token.Method.(*jwt.SigningMethodHMAC); !ok { + return nil, fmt.Errorf( + "unexpexted signing method: %v", + token.Header["alg"], + ) + } + return []byte(secretKey), nil + }, + ) + if e != nil { + return nil, fmt.Errorf("token validation failed: %w", e) + } + if claims, ok := token.Claims.(jwt.MapClaims); ok && token.Valid { + result := make(map[string]any) + for key, value := range claims { + if key == "exp" || key == "iat" || key == "nbf" { + continue + } + result[key] = value + } + return result, nil + } + return nil, fmt.Errorf("invalid token") +} diff --git a/api/token.go b/api/token.go deleted file mode 100644 index 925841b..0000000 --- a/api/token.go +++ /dev/null @@ -1,97 +0,0 @@ -package api - -import ( - "auth_service/database" - "auth_service/model" - "encoding/json" - "fmt" - "maps" - "net/http" - "time" - - "github.com/golang-jwt/jwt/v5" -) - -const defaultsecretkey = "secret" - -func createJWT(secretKey string, data map[string]any, ttl time.Duration) (string, error) { - claims := jwt.MapClaims{ - "exp": time.Now().Add(ttl).Unix(), - "iat": time.Now().Unix(), - "nbf": time.Now().Unix(), - } - maps.Copy(claims, data) - token := jwt.NewWithClaims(jwt.SigningMethodHS256, claims) - signedToken, err := token.SignedString([]byte(secretKey)) - if err != nil { - return "", nil - } - return signedToken, nil -} - -func VerifyJWT(tokenString string, secretKey string) (map[string]any, error) { - token, e := jwt.Parse( - tokenString, - func(token *jwt.Token) (any, error) { - if _, ok := token.Method.(*jwt.SigningMethodHMAC); !ok { - return nil, fmt.Errorf("unexpexted signing method: %v", token.Header["alg"]) - } - return []byte(secretKey), nil - }, - ) - if e != nil { - return nil, fmt.Errorf("token validation failed: %w", e) - } - if claims, ok := token.Claims.(jwt.MapClaims); ok && token.Valid { - result := make(map[string]any) - for key, value := range claims { - if key == "exp" || key == "iat" || key == "nbf" { - continue - } - result[key] = value - } - return result, nil - } - return nil, fmt.Errorf("invalid token") -} - -func Token(w http.ResponseWriter, req *http.Request) { - w.Header().Set("Content-Type", "application/json") - var request model.TokenRequest - decoder := json.NewDecoder(req.Body) - decoder.Decode(&request) - dbuser, e := database.GetUserByUsername(request.Username) - if e != nil { - fmt.Fprintf(w, "{\"status\":403,\"error\":\"%v\"}", e) - return - } - if dbuser.Password == request.Password { - responseUser := model.UserResponse{ - Id: dbuser.Id, - Username: dbuser.Username, - Email: dbuser.Email, - Group: dbuser.Group, - IsSuperuser: dbuser.IsSuperuser, - } - responseUserMarshal, _ := json.Marshal(responseUser) - responseUserUnmarshal := make(map[string]any) - json.Unmarshal(responseUserMarshal, &responseUserUnmarshal) - token, _ := createJWT(defaultsecretkey, responseUserUnmarshal, time.Duration(24*time.Hour)) - fmt.Fprintf(w, "{\"token\":\"%s\"}", token) - return - } - fmt.Fprintf(w, "{\"status\":\"403\"}") -} - -func VerifyToken(w http.ResponseWriter, req *http.Request) { - w.Header().Set("Content-Type", "application/json") - var request model.Token - decoder := json.NewDecoder(req.Body) - decoder.Decode(&request) - _, e := VerifyJWT(request.Token, defaultsecretkey) - if e != nil { - fmt.Fprintf(w, "{\"status\":403}") - return - } - fmt.Fprintf(w, "{\"status\":200}") -} diff --git a/api/users.go b/api/users.go deleted file mode 100644 index 3c05df9..0000000 --- a/api/users.go +++ /dev/null @@ -1,222 +0,0 @@ -package api - -import ( - "auth_service/database" - "auth_service/model" - "encoding/json" - "fmt" - "net/http" - - "github.com/google/uuid" -) - -func GetAllUsers(w http.ResponseWriter, req *http.Request) { - w.Header().Set("Content-Type", "application/json") - var request model.GetAllUsersRequest - decoder := json.NewDecoder(req.Body) - decoder.Decode(&request) - claims, e := VerifyJWT(request.Token, defaultsecretkey) - if e != nil || claims["is_superuser"] != true { - fmt.Fprintf(w, "{\"status\":403}") - return - } - users, e := database.GetAllUsers() - if e != nil { - fmt.Fprintf(w, "{\"error\":\"%v\"}", e) - return - } - var responseUsers []model.UserResponse - for i := range users { - responseUsers = append(responseUsers, model.UserResponse{ - Id: users[i].Id, - Username: users[i].Username, - Email: users[i].Email, - Group: users[i].Group, - IsSuperuser: users[i].IsSuperuser, - }) - } - jsondata, _ := json.Marshal(responseUsers) - fmt.Fprint(w, string(jsondata)) -} - -func GetUser(w http.ResponseWriter, req *http.Request) { - w.Header().Set("Content-Type", "application/json") - var request model.Token - decoder := json.NewDecoder(req.Body) - decoder.Decode(&request) - claims, e := VerifyJWT(request.Token, defaultsecretkey) - if e != nil { - fmt.Fprintf(w, "{\"status\":403}") - return - } - user, e := database.GetUserByUsername(fmt.Sprintf("%v", claims["username"])) - if e != nil { - fmt.Fprintf(w, "{\"error\":\"%v\"}", e) - return - } - responseUser := model.UserResponse{ - Id: user.Id, - Username: user.Username, - Email: user.Email, - Group: user.Group, - IsSuperuser: user.IsSuperuser, - } - jsondata, _ := json.Marshal(responseUser) - fmt.Fprint(w, string(jsondata)) -} - -func ChangePassword(w http.ResponseWriter, req *http.Request) { - w.Header().Set("Content-Type", "application/json") - var request model.ChangePasswordRequest - decoder := json.NewDecoder(req.Body) - decoder.Decode(&request) - claims, e := VerifyJWT(request.Token, defaultsecretkey) - if e != nil { - fmt.Fprintf(w, "{\"status\": 403}") - return - } - user, e := database.GetUserByUsername(fmt.Sprintf("%v", claims["username"])) - if e != nil { - fmt.Fprintf(w, "{\"error\":\"%v\"}", e) - return - } - if user.Password == request.OldPassword { - database.Db.Model(&user).Update("Password", request.NewPassword) - fmt.Fprint(w, "{\"status\":200}") - return - } - fmt.Fprintf(w, "{\"status\":403}") -} - -func DelUser(w http.ResponseWriter, req *http.Request) { - w.Header().Set("Content-Type", "application/json") - var request model.DelUserRequest - decoder := json.NewDecoder(req.Body) - decoder.Decode(&request) - claims, e := VerifyJWT(request.Token, defaultsecretkey) - if e != nil { - fmt.Fprintf(w, "{\"status\": 403}") - return - } - if claims["is_superuser"] == true || request.UserId != "" { - user, e := database.GetUserById(request.UserId) - if e != nil { - fmt.Fprintf(w, "{\"error\":\"%v\"}", e) - return - } - e = database.DeleteUser(user.Id) - if e != nil { - fmt.Fprintf(w, "{\"error\":\"%v\"}", e) - return - } - fmt.Fprintf(w, "{\"status\":200}") - return - } - e = database.DeleteUser(fmt.Sprintf("%v", claims["id"])) - if e != nil { - fmt.Fprintf(w, "{\"error\":\"%v\"}", e) - return - } - fmt.Fprint(w, "{\"status\":200}") -} - -func AddUser(w http.ResponseWriter, req *http.Request) { - w.Header().Set("Content-Type", "application/json") - var request model.AddUserRequest - decoder := json.NewDecoder(req.Body) - decoder.Decode(&request) - claims, e := VerifyJWT(request.Token, defaultsecretkey) - if e != nil { - fmt.Fprintf(w, "{\"status\": 403}") - return - } - if claims["is_superuser"] == true { - id, err := uuid.NewRandom() - if err != nil { - fmt.Fprintf(w, "{\"error\":\"%v\"}", err) - return - } - _, e := database.GetUserByUsername(request.Username) - if e != nil { - e = database.CreateUser(&model.User{ - Id: id.String(), - Username: request.Username, - Email: request.Email, - Password: request.Password, - Group: request.Group, - IsSuperuser: request.IsSuperuser, - }) - if e != nil { - fmt.Fprintf(w, "{\"error\":\"%v\"}", e) - return - } - fmt.Fprintf(w, "{\"status\": 200}") - return - } - fmt.Fprintf(w, "{\"error\":\"username already exists\"}") - return - } - fmt.Fprintf(w, "{\"status\":403}") -} - -func RegisterUser(w http.ResponseWriter, req *http.Request) { - w.Header().Set("Content-Type", "application/json") - var request model.AddUserRequest - decoder := json.NewDecoder(req.Body) - decoder.Decode(&request) - if request.Username == "" { - fmt.Fprintf(w, "{\"error\":\"need more data\"}") - return - } - id, err := uuid.NewRandom() - if err != nil { - fmt.Fprintf(w, "{\"error\":\"%v\"}", err) - return - } - group := "users" - if request.Group != "" { - group = request.Group - } - _, e := database.GetUserByUsername(request.Username) - if e != nil { - e = database.CreateUser(&model.User{ - Id: id.String(), - Username: request.Username, - Email: request.Email, - Password: request.Password, - Group: group, - IsSuperuser: request.IsSuperuser, - }) - if e != nil { - fmt.Fprintf(w, "{\"error\":\"%v\"}", e) - return - } - fmt.Fprintf(w, "{\"status\": 200}") - return - } - fmt.Fprintf(w, "{\"error\":\"username already exists\"}") -} - -func ChangeUser(w http.ResponseWriter, req *http.Request) { - w.Header().Set("Content-Type", "application/json") - var request model.ChangeUserRequest - decoder := json.NewDecoder(req.Body) - decoder.Decode(&request) - claims, e := VerifyJWT(request.Token, defaultsecretkey) - if e != nil { - fmt.Fprintf(w, "{\"status\": 403}") - return - } - user, e := database.GetUserByUsername(fmt.Sprintf("%v", claims["username"])) - if e != nil { - fmt.Fprintf(w, "{\"error\":\"%v\"}", e) - return - } - database.Db.Model(&user).Updates(map[string]any{ - "Username": request.Username, - "Email": request.Email, - "Group": request.Group, - "IsSuperuser": request.IsSuperuser, - }) - fmt.Fprint(w, "{\"status\":200}") -} diff --git a/api/users/adduser.go b/api/users/adduser.go new file mode 100644 index 0000000..3f01c43 --- /dev/null +++ b/api/users/adduser.go @@ -0,0 +1,51 @@ +package users + +import ( + "auth_service/api/jwt" + "auth_service/database" + "auth_service/model" + "encoding/json" + "fmt" + "net/http" + + "github.com/google/uuid" +) + +func AddUser(w http.ResponseWriter, req *http.Request) { + w.Header().Set("Content-Type", "application/json") + var request model.AddUserRequest + decoder := json.NewDecoder(req.Body) + decoder.Decode(&request) + claims, e := jwt.VerifyJWT(request.Token, jwt.Defaultsecretkey) + if e != nil { + fmt.Fprintf(w, "{\"status\": 403}") + return + } + if claims["is_superuser"] == true { + id, err := uuid.NewRandom() + if err != nil { + fmt.Fprintf(w, "{\"error\":\"%v\"}", err) + return + } + _, e := database.GetUserByUsername(request.Username) + if e != nil { + e = database.CreateUser(&model.User{ + Id: id.String(), + Username: request.Username, + Email: request.Email, + Password: request.Password, + Group: request.Group, + IsSuperuser: request.IsSuperuser, + }) + if e != nil { + fmt.Fprintf(w, "{\"error\":\"%v\"}", e) + return + } + fmt.Fprintf(w, "{\"status\": 200}") + return + } + fmt.Fprintf(w, "{\"error\":\"username already exists\"}") + return + } + fmt.Fprintf(w, "{\"status\":403}") +} diff --git a/api/users/allusers.go b/api/users/allusers.go new file mode 100644 index 0000000..77be96a --- /dev/null +++ b/api/users/allusers.go @@ -0,0 +1,39 @@ +package users + +import ( + "auth_service/api/jwt" + "auth_service/database" + "auth_service/model" + "encoding/json" + "fmt" + "net/http" +) + +func GetAllUsers(w http.ResponseWriter, req *http.Request) { + w.Header().Set("Content-Type", "application/json") + var request model.GetAllUsersRequest + decoder := json.NewDecoder(req.Body) + decoder.Decode(&request) + claims, e := jwt.VerifyJWT(request.Token, jwt.Defaultsecretkey) + if e != nil || claims["is_superuser"] != true { + fmt.Fprintf(w, "{\"status\":403}") + return + } + users, e := database.GetAllUsers() + if e != nil { + fmt.Fprintf(w, "{\"error\":\"%v\"}", e) + return + } + var responseUsers []model.UserResponse + for i := range users { + responseUsers = append(responseUsers, model.UserResponse{ + Id: users[i].Id, + Username: users[i].Username, + Email: users[i].Email, + Group: users[i].Group, + IsSuperuser: users[i].IsSuperuser, + }) + } + jsondata, _ := json.Marshal(responseUsers) + fmt.Fprint(w, string(jsondata)) +} diff --git a/api/users/chuser.go b/api/users/chuser.go new file mode 100644 index 0000000..e5d96c7 --- /dev/null +++ b/api/users/chuser.go @@ -0,0 +1,36 @@ +package users + +import ( + "auth_service/api/jwt" + "auth_service/database" + "auth_service/model" + "encoding/json" + "fmt" + "net/http" +) + +func ChangeUser(w http.ResponseWriter, req *http.Request) { + w.Header().Set("Content-Type", "application/json") + var request model.ChangeUserRequest + decoder := json.NewDecoder(req.Body) + decoder.Decode(&request) + claims, e := jwt.VerifyJWT(request.Token, jwt.Defaultsecretkey) + if e != nil { + fmt.Fprintf(w, "{\"status\": 403}") + return + } + user, e := database.GetUserByUsername( + fmt.Sprintf("%v", claims["username"]), + ) + if e != nil { + fmt.Fprintf(w, "{\"error\":\"%v\"}", e) + return + } + database.Db.Model(&user).Updates(map[string]any{ + "Username": request.Username, + "Email": request.Email, + "Group": request.Group, + "IsSuperuser": request.IsSuperuser, + }) + fmt.Fprint(w, "{\"status\":200}") +} diff --git a/api/users/deluser.go b/api/users/deluser.go new file mode 100644 index 0000000..c062712 --- /dev/null +++ b/api/users/deluser.go @@ -0,0 +1,42 @@ +package users + +import ( + "auth_service/api/jwt" + "auth_service/database" + "auth_service/model" + "encoding/json" + "fmt" + "net/http" +) + +func DelUser(w http.ResponseWriter, req *http.Request) { + w.Header().Set("Content-Type", "application/json") + var request model.DelUserRequest + decoder := json.NewDecoder(req.Body) + decoder.Decode(&request) + claims, e := jwt.VerifyJWT(request.Token, jwt.Defaultsecretkey) + if e != nil { + fmt.Fprintf(w, "{\"status\": 403}") + return + } + if claims["is_superuser"] == true || request.UserId != "" { + user, e := database.GetUserById(request.UserId) + if e != nil { + fmt.Fprintf(w, "{\"error\":\"%v\"}", e) + return + } + e = database.DeleteUser(user.Id) + if e != nil { + fmt.Fprintf(w, "{\"error\":\"%v\"}", e) + return + } + fmt.Fprintf(w, "{\"status\":200}") + return + } + e = database.DeleteUser(fmt.Sprintf("%v", claims["id"])) + if e != nil { + fmt.Fprintf(w, "{\"error\":\"%v\"}", e) + return + } + fmt.Fprint(w, "{\"status\":200}") +} diff --git a/api/users/password.go b/api/users/password.go new file mode 100644 index 0000000..95b5f64 --- /dev/null +++ b/api/users/password.go @@ -0,0 +1,38 @@ +package users + +import ( + "auth_service/api/jwt" + "auth_service/database" + "auth_service/model" + "encoding/json" + "fmt" + "net/http" +) + +func ChangePassword(w http.ResponseWriter, req *http.Request) { + w.Header().Set("Content-Type", "application/json") + var request model.ChangePasswordRequest + decoder := json.NewDecoder(req.Body) + decoder.Decode(&request) + claims, e := jwt.VerifyJWT(request.Token, jwt.Defaultsecretkey) + if e != nil { + fmt.Fprintf(w, "{\"status\": 403}") + return + } + user, e := database.GetUserByUsername( + fmt.Sprintf("%v", claims["username"]), + ) + if e != nil { + fmt.Fprintf(w, "{\"error\":\"%v\"}", e) + return + } + if user.Password == request.OldPassword { + database.Db.Model(&user).Update( + "Password", + request.NewPassword, + ) + fmt.Fprint(w, "{\"status\":200}") + return + } + fmt.Fprintf(w, "{\"status\":403}") +} diff --git a/api/users/register.go b/api/users/register.go new file mode 100644 index 0000000..dbafe7f --- /dev/null +++ b/api/users/register.go @@ -0,0 +1,49 @@ +package users + +import ( + "auth_service/database" + "auth_service/model" + "encoding/json" + "fmt" + "net/http" + + "github.com/google/uuid" +) + +func RegisterUser(w http.ResponseWriter, req *http.Request) { + w.Header().Set("Content-Type", "application/json") + var request model.AddUserRequest + decoder := json.NewDecoder(req.Body) + decoder.Decode(&request) + if request.Username == "" { + fmt.Fprintf(w, "{\"error\":\"need more data\"}") + return + } + id, err := uuid.NewRandom() + if err != nil { + fmt.Fprintf(w, "{\"error\":\"%v\"}", err) + return + } + group := "users" + if request.Group != "" { + group = request.Group + } + _, e := database.GetUserByUsername(request.Username) + if e != nil { + e = database.CreateUser(&model.User{ + Id: id.String(), + Username: request.Username, + Email: request.Email, + Password: request.Password, + Group: group, + IsSuperuser: request.IsSuperuser, + }) + if e != nil { + fmt.Fprintf(w, "{\"error\":\"%v\"}", e) + return + } + fmt.Fprintf(w, "{\"status\": 200}") + return + } + fmt.Fprintf(w, "{\"error\":\"username already exists\"}") +} diff --git a/api/users/user.go b/api/users/user.go new file mode 100644 index 0000000..8c0935f --- /dev/null +++ b/api/users/user.go @@ -0,0 +1,38 @@ +package users + +import ( + "auth_service/api/jwt" + "auth_service/database" + "auth_service/model" + "encoding/json" + "fmt" + "net/http" +) + +func GetUser(w http.ResponseWriter, req *http.Request) { + w.Header().Set("Content-Type", "application/json") + var request model.Token + decoder := json.NewDecoder(req.Body) + decoder.Decode(&request) + claims, e := jwt.VerifyJWT(request.Token, jwt.Defaultsecretkey) + if e != nil { + fmt.Fprintf(w, "{\"status\":403}") + return + } + user, e := database.GetUserByUsername( + fmt.Sprintf("%v", claims["username"]), + ) + if e != nil { + fmt.Fprintf(w, "{\"error\":\"%v\"}", e) + return + } + responseUser := model.UserResponse{ + Id: user.Id, + Username: user.Username, + Email: user.Email, + Group: user.Group, + IsSuperuser: user.IsSuperuser, + } + jsondata, _ := json.Marshal(responseUser) + fmt.Fprint(w, string(jsondata)) +} diff --git a/go.mod b/go.mod index 0f7cbba..de4d322 100644 --- a/go.mod +++ b/go.mod @@ -3,7 +3,7 @@ module auth_service go 1.24.3 require ( - github.com/golang-jwt/jwt/v5 v5.2.2 + github.com/golang-jwt/jwt v3.2.2+incompatible github.com/google/uuid v1.6.0 github.com/joho/godotenv v1.5.1 gorm.io/driver/sqlite v1.5.7 diff --git a/main.go b/main.go index 7e7d194..1940ecd 100644 --- a/main.go +++ b/main.go @@ -1,7 +1,8 @@ package main import ( - "auth_service/api" + "auth_service/api/auth" + "auth_service/api/users" "auth_service/database" "log" "net/http" @@ -19,24 +20,24 @@ func main() { database.Migrate() if os.Getenv("USERS_FILE") != "" { - users := database.GetUsersFromFile(os.Getenv("USERS_FILE")) - for i := range users { - database.CreateUser(&users[i]) + allusers := database.GetUsersFromFile(os.Getenv("USERS_FILE")) + for i := range allusers { + database.CreateUser(&allusers[i]) } } - http.HandleFunc("/api/token", api.Token) - http.HandleFunc("/api/token/verify", api.VerifyToken) - http.HandleFunc("/api/access", api.VerifyToken) + http.HandleFunc("/api/token", auth.Token) + http.HandleFunc("/api/token/verify", auth.VerifyToken) + http.HandleFunc("/api/access", auth.VerifyToken) if os.Getenv("ENABLE_SELF_REGISTER") == "true" { - http.HandleFunc("/api/register", api.RegisterUser) + http.HandleFunc("/api/register", users.RegisterUser) } - http.HandleFunc("/api/users", api.GetAllUsers) - http.HandleFunc("/api/users/user", api.GetUser) - http.HandleFunc("/api/users/password", api.ChangePassword) - http.HandleFunc("/api/users/change", api.ChangeUser) - http.HandleFunc("/api/users/del", api.DelUser) - http.HandleFunc("/api/users/add", api.AddUser) + http.HandleFunc("/api/users", users.GetAllUsers) + http.HandleFunc("/api/users/user", users.GetUser) + http.HandleFunc("/api/users/password", users.ChangePassword) + http.HandleFunc("/api/users/change", users.ChangeUser) + http.HandleFunc("/api/users/del", users.DelUser) + http.HandleFunc("/api/users/add", users.AddUser) http.ListenAndServe(":8090", nil) }