feat(auth): Add login, register, session_info and api creation
This commit is contained in:
34
app/services/api_key.go
Normal file
34
app/services/api_key.go
Normal file
@@ -0,0 +1,34 @@
|
||||
package services
|
||||
|
||||
import (
|
||||
"encoding/base64"
|
||||
"fmt"
|
||||
|
||||
"git.secnex.io/secnex/auth-api/database"
|
||||
"git.secnex.io/secnex/auth-api/models"
|
||||
"git.secnex.io/secnex/auth-api/utils"
|
||||
"github.com/gofiber/fiber/v2"
|
||||
"github.com/google/uuid"
|
||||
)
|
||||
|
||||
func CreateApiKey() *utils.HTTPResponse {
|
||||
keyID := uuid.New()
|
||||
key := utils.GenerateRandomString(32)
|
||||
createApiKey := &models.ApiKey{
|
||||
ID: keyID,
|
||||
Key: key,
|
||||
}
|
||||
|
||||
if err := database.DB.Create(createApiKey).Error; err != nil {
|
||||
return utils.NewHTTPResponse(fiber.StatusInternalServerError, &fiber.Map{
|
||||
"message": "Error creating API key",
|
||||
}, "", nil, nil)
|
||||
}
|
||||
|
||||
apiKeyPlain := fmt.Sprintf("%s:%s", keyID.String(), key)
|
||||
apiKey := base64.StdEncoding.EncodeToString([]byte(apiKeyPlain))
|
||||
return utils.NewHTTPResponse(fiber.StatusOK, &fiber.Map{
|
||||
"message": "API key created successfully",
|
||||
"key": apiKey,
|
||||
}, "", nil, nil)
|
||||
}
|
||||
67
app/services/login.go
Normal file
67
app/services/login.go
Normal file
@@ -0,0 +1,67 @@
|
||||
package services
|
||||
|
||||
import (
|
||||
"time"
|
||||
|
||||
"git.secnex.io/secnex/auth-api/config"
|
||||
"git.secnex.io/secnex/auth-api/repositories"
|
||||
"git.secnex.io/secnex/auth-api/utils"
|
||||
"git.secnex.io/secnex/masterlog"
|
||||
"github.com/gofiber/fiber/v2"
|
||||
"github.com/golang-jwt/jwt/v5"
|
||||
)
|
||||
|
||||
func Login(username, password string) *utils.HTTPResponse {
|
||||
// Get user by username
|
||||
user, err := repositories.GetUserByUsername(username)
|
||||
if err != nil {
|
||||
return utils.NewHTTPResponse(fiber.StatusNotFound, &fiber.Map{
|
||||
"message": "User not found",
|
||||
}, "", nil, nil)
|
||||
}
|
||||
if user == nil {
|
||||
return utils.NewHTTPResponse(fiber.StatusNotFound, &fiber.Map{
|
||||
"message": "User not found",
|
||||
}, "", nil, nil)
|
||||
}
|
||||
|
||||
hashedPassword := user.Password
|
||||
valid, err := utils.Verify(password, hashedPassword)
|
||||
if err != nil {
|
||||
return utils.NewHTTPResponse(fiber.StatusInternalServerError, &fiber.Map{
|
||||
"message": "Error verifying password",
|
||||
}, "", nil, nil)
|
||||
}
|
||||
if !valid {
|
||||
return utils.NewHTTPResponse(fiber.StatusUnauthorized, &fiber.Map{
|
||||
"message": "Invalid password",
|
||||
}, "", nil, nil)
|
||||
}
|
||||
|
||||
session := repositories.CreateSession(user)
|
||||
if session == nil {
|
||||
return utils.NewHTTPResponse(fiber.StatusInternalServerError, &fiber.Map{
|
||||
"message": "Error creating session",
|
||||
}, "", nil, nil)
|
||||
}
|
||||
|
||||
masterlog.Debug("Session created successfully", map[string]interface{}{"session_id": session.ID, "user_id": session.UserID})
|
||||
|
||||
token := jwt.NewWithClaims(jwt.SigningMethodHS256, jwt.MapClaims{
|
||||
"sub": session.ID.String(),
|
||||
"exp": time.Now().Add(time.Hour * 24).Unix(),
|
||||
})
|
||||
|
||||
secret := config.CONFIG.JwtSecret
|
||||
tokenString, err := token.SignedString([]byte(secret))
|
||||
if err != nil {
|
||||
return utils.NewHTTPResponse(fiber.StatusInternalServerError, &fiber.Map{
|
||||
"message": "Error generating token",
|
||||
}, "", nil, nil)
|
||||
}
|
||||
|
||||
return utils.NewHTTPResponse(fiber.StatusOK, &fiber.Map{
|
||||
"message": "Login successful",
|
||||
"token": tokenString,
|
||||
}, "", nil, nil)
|
||||
}
|
||||
37
app/services/register.go
Normal file
37
app/services/register.go
Normal file
@@ -0,0 +1,37 @@
|
||||
package services
|
||||
|
||||
import (
|
||||
"git.secnex.io/secnex/auth-api/repositories"
|
||||
"git.secnex.io/secnex/auth-api/utils"
|
||||
"github.com/gofiber/fiber/v2"
|
||||
)
|
||||
|
||||
func Register(firstName, lastName, username, password, email string) *utils.HTTPResponse {
|
||||
user, err := repositories.GetUserByUniqueFields(username, email)
|
||||
if err != nil {
|
||||
return utils.NewHTTPResponse(fiber.StatusInternalServerError, &fiber.Map{
|
||||
"message": "Error getting user",
|
||||
}, "", nil, nil)
|
||||
}
|
||||
if user != nil {
|
||||
return utils.NewHTTPResponse(fiber.StatusBadRequest, &fiber.Map{
|
||||
"message": "User already exists",
|
||||
}, "", nil, nil)
|
||||
}
|
||||
|
||||
err = repositories.CreateUser(firstName, lastName, username, password, email)
|
||||
if err != nil {
|
||||
if utils.IsDuplicateKeyError(err) {
|
||||
return utils.NewHTTPResponse(fiber.StatusBadRequest, &fiber.Map{
|
||||
"message": "User already exists",
|
||||
}, "", nil, nil)
|
||||
}
|
||||
return utils.NewHTTPResponse(fiber.StatusInternalServerError, &fiber.Map{
|
||||
"message": "Error creating user",
|
||||
}, "", nil, nil)
|
||||
}
|
||||
|
||||
return utils.NewHTTPResponse(fiber.StatusOK, &fiber.Map{
|
||||
"message": "Your account has been created successfully. Please check your email for verification. If you don't see it, please check your spam folder.",
|
||||
}, "", nil, nil)
|
||||
}
|
||||
49
app/services/session_info.go
Normal file
49
app/services/session_info.go
Normal file
@@ -0,0 +1,49 @@
|
||||
package services
|
||||
|
||||
import (
|
||||
"errors"
|
||||
"fmt"
|
||||
|
||||
"git.secnex.io/secnex/auth-api/config"
|
||||
"git.secnex.io/secnex/auth-api/repositories"
|
||||
"git.secnex.io/secnex/masterlog"
|
||||
"github.com/golang-jwt/jwt/v5"
|
||||
"github.com/google/uuid"
|
||||
)
|
||||
|
||||
func SessionInfo(token string) (*repositories.SessionDetails, error) {
|
||||
claims, err := jwt.ParseWithClaims(token, &jwt.MapClaims{}, func(token *jwt.Token) (interface{}, error) {
|
||||
return []byte(config.CONFIG.JwtSecret), nil
|
||||
})
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
if !claims.Valid {
|
||||
return nil, errors.New("invalid token")
|
||||
}
|
||||
|
||||
mapClaims := claims.Claims.(*jwt.MapClaims)
|
||||
subValue, ok := (*mapClaims)["sub"]
|
||||
if !ok {
|
||||
return nil, errors.New("sub claim not found")
|
||||
}
|
||||
|
||||
var sessionID string
|
||||
switch v := subValue.(type) {
|
||||
case string:
|
||||
sessionID = v
|
||||
case uuid.UUID:
|
||||
sessionID = v.String()
|
||||
default:
|
||||
sessionID = fmt.Sprintf("%v", v)
|
||||
}
|
||||
|
||||
masterlog.Debug("Session ID extracted from token", map[string]interface{}{"session_id": sessionID, "sub_type": fmt.Sprintf("%T", subValue)})
|
||||
sessionDetails := repositories.GetSessionCache(sessionID)
|
||||
if sessionDetails == nil {
|
||||
masterlog.Debug("Session not found in cache", map[string]interface{}{"session_id": sessionID})
|
||||
return nil, errors.New("session not found")
|
||||
}
|
||||
masterlog.Debug("Session details retrieved successfully", map[string]interface{}{"session_id": sessionID, "user_id": sessionDetails.UserID})
|
||||
return sessionDetails, nil
|
||||
}
|
||||
Reference in New Issue
Block a user