forked from baron/baron-sso
91 lines
2.3 KiB
Go
91 lines
2.3 KiB
Go
package main
|
|
|
|
import (
|
|
"crypto/rand"
|
|
"encoding/hex"
|
|
"fmt"
|
|
"log"
|
|
"os"
|
|
|
|
"github.com/joho/godotenv"
|
|
"golang.org/x/crypto/bcrypt"
|
|
"gorm.io/driver/postgres"
|
|
"gorm.io/gorm"
|
|
)
|
|
|
|
type ApiKey struct {
|
|
ID string `gorm:"primaryKey;type:uuid;default:gen_random_uuid()"`
|
|
Name string
|
|
ClientID string `gorm:"uniqueIndex"`
|
|
ClientSecretHash string
|
|
Scopes string
|
|
Status string `gorm:"default:'active'"`
|
|
}
|
|
|
|
func generateToken(n int) string {
|
|
b := make([]byte, n)
|
|
if _, err := rand.Read(b); err != nil {
|
|
panic(err)
|
|
}
|
|
return hex.EncodeToString(b)
|
|
}
|
|
|
|
func main() {
|
|
godotenv.Load(".env")
|
|
godotenv.Load("backend/.env")
|
|
|
|
pgHost := os.Getenv("DB_HOST")
|
|
if pgHost == "" {
|
|
pgHost = "localhost"
|
|
}
|
|
pgPort := os.Getenv("DB_PORT")
|
|
if pgPort == "" {
|
|
pgPort = "5432"
|
|
}
|
|
pgUser := os.Getenv("DB_USER")
|
|
if pgUser == "" {
|
|
pgUser = "baron"
|
|
}
|
|
pgPass := os.Getenv("DB_PASSWORD")
|
|
if pgPass == "" {
|
|
pgPass = "password"
|
|
}
|
|
pgName := os.Getenv("DB_NAME")
|
|
if pgName == "" {
|
|
pgName = "baron_sso"
|
|
}
|
|
|
|
dsn := fmt.Sprintf("host=%s user=%s password=%s dbname=%s port=%s sslmode=disable",
|
|
pgHost, pgUser, pgPass, pgName, pgPort)
|
|
|
|
db, err := gorm.Open(postgres.Open(dsn), &gorm.Config{})
|
|
if err != nil {
|
|
log.Fatalf("Failed to connect to DB: %v", err)
|
|
}
|
|
|
|
clientID := generateToken(8)
|
|
plainSecret := generateToken(16)
|
|
hashedSecret, _ := bcrypt.GenerateFromPassword([]byte(plainSecret), bcrypt.DefaultCost)
|
|
|
|
key := ApiKey{
|
|
Name: "Test Admin Key",
|
|
ClientID: clientID,
|
|
ClientSecretHash: string(hashedSecret),
|
|
Scopes: "tenant:read tenant:write user:read user:write audit:read audit:write",
|
|
Status: "active",
|
|
}
|
|
|
|
if err := db.Table("api_keys").Create(&key).Error; err != nil {
|
|
log.Fatalf("Failed to create API key: %v", err)
|
|
}
|
|
|
|
fmt.Println("====================================================")
|
|
fmt.Println("✅ API Key Generated Successfully!")
|
|
fmt.Printf("Client ID: %s\n", clientID)
|
|
fmt.Printf("Client Secret: %s\n", plainSecret)
|
|
fmt.Println("====================================================")
|
|
fmt.Println("Usage Example:")
|
|
fmt.Printf("curl -H \"X-Baron-Key-ID: %s\" -H \"X-Baron-Key-Secret: %s\" http://localhost:3000/api/v1/admin/tenants\n", clientID, plainSecret)
|
|
fmt.Println("====================================================")
|
|
}
|