Files
oc-auth/main.go

142 lines
5.2 KiB
Go
Raw Normal View History

2024-07-26 13:46:05 +02:00
package main
import (
2025-01-17 17:24:08 +01:00
"context"
2026-02-02 10:09:45 +01:00
"encoding/json"
2024-07-26 13:46:05 +02:00
"oc-auth/conf"
"oc-auth/infrastructure"
2025-01-17 17:24:08 +01:00
auth_connectors "oc-auth/infrastructure/auth_connector"
2024-07-26 13:46:05 +02:00
_ "oc-auth/routers"
"strings"
2025-04-01 10:16:26 +02:00
"time"
2024-07-26 13:46:05 +02:00
2024-09-27 09:20:59 +02:00
oclib "cloud.o-forge.io/core/oc-lib"
"cloud.o-forge.io/core/oc-lib/tools"
2026-02-10 09:39:13 +01:00
beego "github.com/beego/beego/v2/server/web"
2024-07-26 13:46:05 +02:00
)
2024-09-27 09:20:59 +02:00
const appname = "oc-auth"
2024-07-26 13:46:05 +02:00
// @securityDefinitions.apikey Bearer
// @in header
// @name Authorization
// @description Type "Bearer" followed by a space and JWT token.
2024-07-26 13:46:05 +02:00
func main() {
2026-02-10 09:39:13 +01:00
oclib.InitAPI(appname)
2024-09-27 09:20:59 +02:00
// Load the right config file
2026-02-04 09:42:20 +01:00
o := oclib.GetConfLoader(appname)
2024-07-26 13:46:05 +02:00
2024-11-05 10:11:39 +01:00
conf.GetConfig().AdminRole = o.GetStringDefault("ADMIN_ROLE", "admin")
2024-10-30 12:38:25 +01:00
conf.GetConfig().PublicKeyPath = o.GetStringDefault("PUBLIC_KEY_PATH", "./pem/public.pem")
conf.GetConfig().PrivateKeyPath = o.GetStringDefault("PRIVATE_KEY_PATH", "./pem/private.pem")
conf.GetConfig().ClientSecret = o.GetStringDefault("CLIENT_SECRET", "oc-auth-got-secret")
conf.GetConfig().OAuth2ClientSecretName = o.GetStringDefault("OAUTH2_CLIENT_SECRET_NAME", "oc-oauth2-client-secret")
conf.GetConfig().OAuth2ClientSecretNamespace = o.GetStringDefault("NAMESPACE", "default")
conf.GetConfig().Auth = o.GetStringDefault("AUTH", "hydra")
conf.GetConfig().AuthConnectorHost = o.GetStringDefault("AUTH_CONNECTOR_HOST", "localhost")
conf.GetConfig().AuthConnectPublicHost = o.GetStringDefault("AUTH_CONNECTOR_PUBLIC_HOST", "localhost")
conf.GetConfig().AuthConnectorPort = o.GetIntDefault("AUTH_CONNECTOR_PORT", 4444)
2025-06-16 09:11:21 +02:00
conf.GetConfig().AuthConnectorAdminPort = o.GetStringDefault("AUTH_CONNECTOR_ADMIN_PORT", "4445/admin")
2025-04-01 10:16:26 +02:00
conf.GetConfig().PermissionConnectorWriteHost = o.GetStringDefault("PERMISSION_CONNECTOR_WRITE_HOST", "keto")
conf.GetConfig().PermissionConnectorReadHost = o.GetStringDefault("PERMISSION_CONNECTOR_READ_HOST", "keto")
2025-06-16 09:11:21 +02:00
conf.GetConfig().PermissionConnectorPort = o.GetStringDefault("PERMISSION_CONNECTOR_PORT", "4466")
conf.GetConfig().PermissionConnectorAdminPort = o.GetStringDefault("PERMISSION_CONNECTOR_ADMIN_PORT", "4467")
conf.GetConfig().Origin = o.GetStringDefault("ADMIN_ORIGIN", "http://localhost:8000")
conf.GetConfig().AdminOrigin = o.GetStringDefault("ADMIN_ORIGIN", "http://localhost:8001")
conf.GetConfig().OAuthRedirectURI = o.GetStringDefault("OAUTH_REDIRECT_URI", "http://google.com")
conf.GetConfig().OAdminAuthRedirectURI = o.GetStringDefault("ADMIN_OAUTH_REDIRECT_URI", "http://chatgpt.com")
2025-04-01 10:16:26 +02:00
conf.GetConfig().Local = o.GetBoolDefault("LOCAL", true)
// config LDAPauth
2025-01-17 17:24:08 +01:00
conf.GetConfig().SourceMode = o.GetStringDefault("SOURCE_MODE", "ldap")
conf.GetConfig().LDAPEndpoints = o.GetStringDefault("LDAP_ENDPOINTS", "ldap:389")
conf.GetConfig().LDAPBindDN = o.GetStringDefault("LDAP_BINDDN", "cn=admin,dc=example,dc=com")
conf.GetConfig().LDAPBindPW = o.GetStringDefault("LDAP_BINDPW", "password")
conf.GetConfig().LDAPBaseDN = o.GetStringDefault("LDAP_BASEDN", "dc=example,dc=com")
2026-02-04 10:47:40 +01:00
conf.GetConfig().LDAPUserBaseDN = o.GetStringDefault("LDAP_USER_BASEDN", "ou=users,dc=example,dc=com")
conf.GetConfig().LDAPRoleBaseDN = o.GetStringDefault("LDAP_ROLE_BASEDN", "ou=AppRoles,dc=example,dc=com")
2025-04-01 10:16:26 +02:00
go generateRole()
go discovery()
2026-02-10 09:39:13 +01:00
beego.Run()
}
2024-10-30 12:38:25 +01:00
2025-01-17 17:24:08 +01:00
func generateRole() {
2026-02-19 14:56:15 +01:00
logger := oclib.GetLogger()
2025-01-17 17:24:08 +01:00
defer func() {
if r := recover(); r != nil {
2026-02-19 14:56:15 +01:00
logger.Error().Msgf("generateRole recovered from panic: %v", r)
2025-01-17 17:24:08 +01:00
}
}()
if conf.GetConfig().SourceMode == "ldap" {
2025-11-20 16:31:10 +01:00
for {
ldap := auth_connectors.New()
roles, err := ldap.GetRoles(context.Background())
if err == nil {
2026-02-19 14:56:15 +01:00
logger.Info().Msgf("Syncing %d LDAP role groups to Keto", len(roles))
2025-11-20 16:31:10 +01:00
for _, role := range roles {
for r, m := range role.Members {
infrastructure.GetPermissionConnector("").CreateRole(r)
for _, p := range m {
infrastructure.GetPermissionConnector("").BindRole(r, p)
}
2025-04-01 10:16:26 +02:00
}
2025-01-17 17:24:08 +01:00
}
2025-11-20 16:31:10 +01:00
break
} else {
2026-02-19 14:56:15 +01:00
logger.Error().Msg("Failed to get LDAP roles, retrying in 10s: " + err.Error())
time.Sleep(10 * time.Second)
2025-11-20 16:31:10 +01:00
continue
2025-01-17 17:24:08 +01:00
}
}
}
}
2024-10-30 12:38:25 +01:00
func discovery() {
2026-02-19 14:56:15 +01:00
logger := oclib.GetLogger()
2025-04-01 10:16:26 +02:00
defer func() {
if r := recover(); r != nil {
2026-02-19 14:56:15 +01:00
logger.Error().Msgf("discovery recovered from panic: %v", r)
2025-04-01 10:16:26 +02:00
}
}()
2025-11-20 16:31:10 +01:00
for {
api := tools.API{}
conn := infrastructure.GetPermissionConnector("")
2026-02-19 14:56:15 +01:00
logger.Info().Msg("Starting permission discovery")
2025-11-20 16:31:10 +01:00
_, _, err := conn.CreateRole(conf.GetConfig().AdminRole)
if err != nil {
if !strings.Contains(err.Error(), "already exist") {
logger.Error().Msg("Failed to create admin role, retrying in 10s: " + err.Error())
time.Sleep(10 * time.Second)
continue
}
}
if _, _, err := conn.BindRole(conf.GetConfig().AdminRole, "admin"); err != nil {
logger.Error().Msg("Failed to admin bind role: " + err.Error())
2025-11-20 16:31:10 +01:00
}
2026-02-02 10:09:45 +01:00
addPermissions := func(m tools.NATSResponse) {
var resp map[string][]interface{}
json.Unmarshal(m.Payload, &resp)
for k, v := range resp {
for _, p := range v {
if _, _, err := conn.CreatePermission(k, p.(string), true); err != nil {
logger.Error().Msg("Failed to admin create permission: " + err.Error())
}
2025-11-20 16:31:10 +01:00
}
}
}
2025-11-20 16:31:10 +01:00
api.ListenRouter(addPermissions)
2026-02-02 10:09:45 +01:00
b, _ := json.Marshal(map[string]interface{}{})
tools.NewNATSCaller().SetNATSPub(tools.DISCOVERY, tools.NATSResponse{
FromApp: "oc-auth",
Datatype: -1,
User: "root",
Method: tools.GET.EnumIndex(),
Payload: b,
})
2025-11-20 16:31:10 +01:00
break
}
2024-07-26 13:46:05 +02:00
}