- 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
68 lines
1.9 KiB
Go
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
|
|
}
|