Files
Cyrene_v2/backend/services/gateway/api/auth_stub.go
T
Aska fbb331ed4b feat(auth): replace stub auth with real JWT + bcrypt
- RealAuthManager: JWT signing/validation + bcrypt password hashing
- MemUserStore: in-memory user store with default admin
- Register endpoint: user creation with hashed password
- Login endpoint: bcrypt verification + JWT generation
- AuthManager interface extended with Login/Register methods
2026-08-12 12:21:36 +08:00

68 lines
1.9 KiB
Go

package api
import (
"net/http"
)
// StubAuthManager is an in-memory auth manager for development and testing.
type StubAuthManager struct {
tokens map[string]TokenInfo
users map[string]UserInfo
}
// TokenInfo holds decoded token information.
type TokenInfo struct {
UserID string
Username string
Role string
}
// UserInfo holds user credentials (development only — production uses bcrypt).
type UserInfo struct {
Username string
Password string
Role string
}
// NewStubAuthManager creates an in-memory auth manager with a default admin user.
func NewStubAuthManager() *StubAuthManager {
m := &StubAuthManager{
tokens: make(map[string]TokenInfo),
users: make(map[string]UserInfo),
}
m.users["admin"] = UserInfo{Username: "admin", Password: "admin", Role: "admin"}
m.users["user"] = UserInfo{Username: "user", Password: "user", Role: "user"}
return m
}
// ValidateToken validates a stub token.
func (m *StubAuthManager) ValidateToken(token string) (string, string, string, error) {
info, ok := m.tokens[token]
if !ok {
return "", "", "", http.ErrNoCookie
}
return info.UserID, info.Username, info.Role, nil
}
// Login authenticates a user and returns a stub token.
func (m *StubAuthManager) Login(username, password string) (string, error) {
user, ok := m.users[username]
if !ok || user.Password != password {
return "", http.ErrNoCookie
}
token := "stub-token-" + username
m.tokens[token] = TokenInfo{UserID: username, Username: username, Role: user.Role}
return token, nil
}
// Register creates a new user and returns a stub token.
func (m *StubAuthManager) Register(username, password string) (string, error) {
if _, exists := m.users[username]; exists {
return "", http.ErrNoCookie
}
m.users[username] = UserInfo{Username: username, Password: password, Role: "user"}
token := "stub-token-" + username
m.tokens[token] = TokenInfo{UserID: username, Username: username, Role: "user"}
return token, nil
}