NOISSUE - Export Auth Package (#34)

* feat(auth): Export auth setup

Since auth is used by other external packages it is wise to export the package of how to connect to auth service so that other packages can be able to use it rather than to rewrite the code
Added envPrefix as a parameter as the user should be able to specify their own ev prefix

Signed-off-by: Rodney Osodo <28790446+rodneyosodo@users.noreply.github.com>

* feat: Add auth configuration loading and setup

This commit adds auth configuration loading and setup to the main.go files in different commands. The modifications include setting up authentication and authorization for various services, connecting to servers, and setting up authentication clients and handlers. Changes are made to the main function and other functions in different packages to set up auth clients and parse configuration options.

Signed-off-by: Rodney Osodo <28790446+rodneyosodo@users.noreply.github.com>

---------

Signed-off-by: Rodney Osodo <28790446+rodneyosodo@users.noreply.github.com>
This commit is contained in:
b1ackd0t
2023-11-17 13:10:40 +03:00
committed by GitHub
parent 1c6beb23de
commit 7acf21a3e1
24 changed files with 348 additions and 199 deletions
+11 -4
View File
@@ -19,13 +19,13 @@ import (
bootstrappg "github.com/absmach/magistrala/bootstrap/postgres"
"github.com/absmach/magistrala/bootstrap/tracing"
"github.com/absmach/magistrala/internal"
authclient "github.com/absmach/magistrala/internal/clients/grpc/auth"
"github.com/absmach/magistrala/internal/clients/jaeger"
pgclient "github.com/absmach/magistrala/internal/clients/postgres"
"github.com/absmach/magistrala/internal/postgres"
"github.com/absmach/magistrala/internal/server"
httpserver "github.com/absmach/magistrala/internal/server/http"
mglog "github.com/absmach/magistrala/logger"
"github.com/absmach/magistrala/pkg/auth"
"github.com/absmach/magistrala/pkg/events/store"
mgsdk "github.com/absmach/magistrala/pkg/sdk/go"
"github.com/absmach/magistrala/pkg/uuid"
@@ -40,6 +40,7 @@ const (
svcName = "bootstrap"
envPrefixDB = "MG_BOOTSTRAP_DB_"
envPrefixHTTP = "MG_BOOTSTRAP_HTTP_"
envPrefixAuth = "MG_AUTH_GRPC_"
defDB = "bootstrap"
defSvcHTTPPort = "9013"
@@ -96,8 +97,14 @@ func main() {
}
defer db.Close()
// Create new auth grpc client api
auth, authHandler, err := authclient.Setup(svcName)
authConfig := auth.Config{}
if err := env.ParseWithOptions(&cfg, env.Options{Prefix: envPrefixAuth}); err != nil {
logger.Error(fmt.Sprintf("failed to load %s auth configuration : %s", svcName, err))
exitCode = 1
return
}
authClient, authHandler, err := auth.Setup(authConfig)
if err != nil {
logger.Error(err.Error())
exitCode = 1
@@ -120,7 +127,7 @@ func main() {
tracer := tp.Tracer(svcName)
// Create new service
svc, err := newService(ctx, auth, db, tracer, logger, cfg, dbConfig)
svc, err := newService(ctx, authClient, db, tracer, logger, cfg, dbConfig)
if err != nil {
logger.Error(fmt.Sprintf("failed to create %s service: %s", svcName, err))
exitCode = 1
+19 -3
View File
@@ -13,10 +13,10 @@ import (
"github.com/absmach/magistrala"
"github.com/absmach/magistrala/internal"
cassandraclient "github.com/absmach/magistrala/internal/clients/cassandra"
authclient "github.com/absmach/magistrala/internal/clients/grpc/auth"
"github.com/absmach/magistrala/internal/server"
httpserver "github.com/absmach/magistrala/internal/server/http"
mglog "github.com/absmach/magistrala/logger"
"github.com/absmach/magistrala/pkg/auth"
"github.com/absmach/magistrala/pkg/uuid"
"github.com/absmach/magistrala/readers"
"github.com/absmach/magistrala/readers/api"
@@ -31,6 +31,8 @@ const (
svcName = "cassandra-reader"
envPrefixDB = "MG_CASSANDRA_"
envPrefixHTTP = "MG_CASSANDRA_READER_HTTP_"
envPrefixAuth = "MG_AUTH_GRPC_"
envPrefixAuthz = "MG_THINGS_AUTH_GRPC_"
defSvcHTTPPort = "9003"
)
@@ -66,7 +68,14 @@ func main() {
}
}
ac, acHandler, err := authclient.Setup(svcName)
authConfig := auth.Config{}
if err := env.ParseWithOptions(&cfg, env.Options{Prefix: envPrefixAuth}); err != nil {
logger.Error(fmt.Sprintf("failed to load %s auth configuration : %s", svcName, err))
exitCode = 1
return
}
ac, acHandler, err := auth.Setup(authConfig)
if err != nil {
logger.Error(err.Error())
exitCode = 1
@@ -76,7 +85,14 @@ func main() {
logger.Info("Successfully connected to auth grpc server " + acHandler.Secure())
tc, tcHandler, err := authclient.SetupAuthz(svcName)
authConfig = auth.Config{}
if err := env.ParseWithOptions(&cfg, env.Options{Prefix: envPrefixAuthz}); err != nil {
logger.Error(fmt.Sprintf("failed to load %s auth configuration : %s", svcName, err))
exitCode = 1
return
}
tc, tcHandler, err := auth.SetupAuthz(authConfig)
if err != nil {
logger.Error(err.Error())
exitCode = 1
+11 -3
View File
@@ -18,13 +18,13 @@ import (
certspg "github.com/absmach/magistrala/certs/postgres"
"github.com/absmach/magistrala/certs/tracing"
"github.com/absmach/magistrala/internal"
authclient "github.com/absmach/magistrala/internal/clients/grpc/auth"
jaegerclient "github.com/absmach/magistrala/internal/clients/jaeger"
pgclient "github.com/absmach/magistrala/internal/clients/postgres"
"github.com/absmach/magistrala/internal/postgres"
"github.com/absmach/magistrala/internal/server"
httpserver "github.com/absmach/magistrala/internal/server/http"
mglog "github.com/absmach/magistrala/logger"
"github.com/absmach/magistrala/pkg/auth"
mgsdk "github.com/absmach/magistrala/pkg/sdk/go"
"github.com/absmach/magistrala/pkg/uuid"
"github.com/caarlos0/env/v10"
@@ -38,6 +38,7 @@ const (
svcName = "certs"
envPrefixDB = "MG_CERTS_DB_"
envPrefixHTTP = "MG_CERTS_HTTP_"
envPrefixAuth = "MG_AUTH_GRPC_"
defDB = "certs"
defSvcHTTPPort = "9019"
)
@@ -112,7 +113,14 @@ func main() {
}
defer db.Close()
auth, authHandler, err := authclient.Setup(svcName)
authConfig := auth.Config{}
if err := env.ParseWithOptions(&cfg, env.Options{Prefix: envPrefixAuth}); err != nil {
logger.Error(fmt.Sprintf("failed to load %s auth configuration : %s", svcName, err))
exitCode = 1
return
}
authClient, authHandler, err := auth.Setup(authConfig)
if err != nil {
logger.Error(err.Error())
exitCode = 1
@@ -135,7 +143,7 @@ func main() {
}()
tracer := tp.Tracer(svcName)
svc := newService(auth, db, tracer, logger, cfg, dbConfig, pkiclient)
svc := newService(authClient, db, tracer, logger, cfg, dbConfig, pkiclient)
httpServerConfig := server.Config{Port: defSvcHTTPPort}
if err := env.ParseWithOptions(&httpServerConfig, env.Options{Prefix: envPrefixHTTP}); err != nil {
+13 -5
View File
@@ -16,12 +16,12 @@ import (
"github.com/absmach/magistrala/coap/api"
"github.com/absmach/magistrala/coap/tracing"
"github.com/absmach/magistrala/internal"
authapi "github.com/absmach/magistrala/internal/clients/grpc/auth"
jaegerclient "github.com/absmach/magistrala/internal/clients/jaeger"
"github.com/absmach/magistrala/internal/server"
coapserver "github.com/absmach/magistrala/internal/server/coap"
httpserver "github.com/absmach/magistrala/internal/server/http"
mglog "github.com/absmach/magistrala/logger"
"github.com/absmach/magistrala/pkg/auth"
"github.com/absmach/magistrala/pkg/messaging/brokers"
brokerstracing "github.com/absmach/magistrala/pkg/messaging/brokers/tracing"
"github.com/absmach/magistrala/pkg/uuid"
@@ -34,6 +34,7 @@ const (
svcName = "coap_adapter"
envPrefix = "MG_COAP_ADAPTER_"
envPrefixHTTP = "MG_COAP_ADAPTER_HTTP_"
envPrefixAuthz = "MG_THINGS_AUTH_GRPC_"
defSvcHTTPPort = "5683"
defSvcCoAPPort = "5683"
)
@@ -86,15 +87,22 @@ func main() {
return
}
auth, aHandler, err := authapi.SetupAuthz(svcName)
authConfig := auth.Config{}
if err := env.ParseWithOptions(&cfg, env.Options{Prefix: envPrefixAuthz}); err != nil {
logger.Error(fmt.Sprintf("failed to load %s auth configuration : %s", svcName, err))
exitCode = 1
return
}
authClient, authHandler, err := auth.SetupAuthz(authConfig)
if err != nil {
logger.Error(err.Error())
exitCode = 1
return
}
defer aHandler.Close()
defer authHandler.Close()
logger.Info("Successfully connected to things grpc server " + aHandler.Secure())
logger.Info("Successfully connected to things grpc server " + authHandler.Secure())
tp, err := jaegerclient.NewProvider(ctx, svcName, cfg.JaegerURL, cfg.InstanceID, cfg.TraceRatio)
if err != nil {
@@ -118,7 +126,7 @@ func main() {
defer nps.Close()
nps = brokerstracing.NewPubSub(coapServerConfig, tracer, nps)
svc := coap.New(auth, nps)
svc := coap.New(authClient, nps)
svc = tracing.New(tracer, svc)
+13 -5
View File
@@ -16,11 +16,11 @@ import (
adapter "github.com/absmach/magistrala/http"
"github.com/absmach/magistrala/http/api"
"github.com/absmach/magistrala/internal"
authapi "github.com/absmach/magistrala/internal/clients/grpc/auth"
jaegerclient "github.com/absmach/magistrala/internal/clients/jaeger"
"github.com/absmach/magistrala/internal/server"
httpserver "github.com/absmach/magistrala/internal/server/http"
mglog "github.com/absmach/magistrala/logger"
"github.com/absmach/magistrala/pkg/auth"
"github.com/absmach/magistrala/pkg/messaging"
"github.com/absmach/magistrala/pkg/messaging/brokers"
brokerstracing "github.com/absmach/magistrala/pkg/messaging/brokers/tracing"
@@ -37,6 +37,7 @@ import (
const (
svcName = "http_adapter"
envPrefix = "MG_HTTP_ADAPTER_"
envPrefixAuthz = "MG_THINGS_AUTH_GRPC_"
defSvcHTTPPort = "80"
targetHTTPPort = "81"
targetHTTPHost = "http://localhost"
@@ -83,15 +84,22 @@ func main() {
return
}
auth, aHandler, err := authapi.SetupAuthz("authz")
authConfig := auth.Config{}
if err := env.ParseWithOptions(&cfg, env.Options{Prefix: envPrefixAuthz}); err != nil {
logger.Error(fmt.Sprintf("failed to load %s auth configuration : %s", svcName, err))
exitCode = 1
return
}
authClient, authHandler, err := auth.SetupAuthz(authConfig)
if err != nil {
logger.Error(err.Error())
exitCode = 1
return
}
defer aHandler.Close()
defer authHandler.Close()
logger.Info("Successfully connected to things grpc server " + aHandler.Secure())
logger.Info("Successfully connected to things grpc server " + authHandler.Secure())
tp, err := jaegerclient.NewProvider(ctx, svcName, cfg.JaegerURL, cfg.InstanceID, cfg.TraceRatio)
if err != nil {
@@ -115,7 +123,7 @@ func main() {
defer pub.Close()
pub = brokerstracing.NewPublisher(httpServerConfig, tracer, pub)
svc := newService(pub, auth, logger, tracer)
svc := newService(pub, authClient, logger, tracer)
targetServerCfg := server.Config{Port: targetHTTPPort}
hs := httpserver.New(ctx, cancel, svcName, targetServerCfg, api.MakeHandler(cfg.InstanceID), logger)
+19 -3
View File
@@ -12,11 +12,11 @@ import (
"github.com/absmach/magistrala"
"github.com/absmach/magistrala/internal"
authclient "github.com/absmach/magistrala/internal/clients/grpc/auth"
influxdbclient "github.com/absmach/magistrala/internal/clients/influxdb"
"github.com/absmach/magistrala/internal/server"
httpserver "github.com/absmach/magistrala/internal/server/http"
mglog "github.com/absmach/magistrala/logger"
"github.com/absmach/magistrala/pkg/auth"
"github.com/absmach/magistrala/pkg/uuid"
"github.com/absmach/magistrala/readers"
"github.com/absmach/magistrala/readers/api"
@@ -30,6 +30,8 @@ import (
const (
svcName = "influxdb-reader"
envPrefixHTTP = "MG_INFLUX_READER_HTTP_"
envPrefixAuth = "MG_AUTH_GRPC_"
envPrefixAuthz = "MG_THINGS_AUTH_GRPC_"
envPrefixDB = "MG_INFLUXDB_"
defSvcHTTPPort = "9005"
)
@@ -65,7 +67,14 @@ func main() {
}
}
ac, acHandler, err := authclient.Setup(svcName)
authConfig := auth.Config{}
if err := env.ParseWithOptions(&cfg, env.Options{Prefix: envPrefixAuth}); err != nil {
logger.Error(fmt.Sprintf("failed to load %s auth configuration : %s", svcName, err))
exitCode = 1
return
}
ac, acHandler, err := auth.Setup(authConfig)
if err != nil {
logger.Error(err.Error())
exitCode = 1
@@ -75,7 +84,14 @@ func main() {
logger.Info("Successfully connected to auth grpc server " + acHandler.Secure())
tc, tcHandler, err := authclient.SetupAuthz(svcName)
authConfig = auth.Config{}
if err := env.ParseWithOptions(&cfg, env.Options{Prefix: envPrefixAuthz}); err != nil {
logger.Error(fmt.Sprintf("failed to load %s auth configuration : %s", svcName, err))
exitCode = 1
return
}
tc, tcHandler, err := auth.SetupAuthz(authConfig)
if err != nil {
logger.Error(err.Error())
exitCode = 1
+19 -3
View File
@@ -12,11 +12,11 @@ import (
"github.com/absmach/magistrala"
"github.com/absmach/magistrala/internal"
authclient "github.com/absmach/magistrala/internal/clients/grpc/auth"
mongoclient "github.com/absmach/magistrala/internal/clients/mongo"
"github.com/absmach/magistrala/internal/server"
httpserver "github.com/absmach/magistrala/internal/server/http"
mglog "github.com/absmach/magistrala/logger"
"github.com/absmach/magistrala/pkg/auth"
"github.com/absmach/magistrala/pkg/uuid"
"github.com/absmach/magistrala/readers"
"github.com/absmach/magistrala/readers/api"
@@ -31,6 +31,8 @@ const (
svcName = "mongodb-reader"
envPrefixDB = "MG_MONGO_"
envPrefixHTTP = "MG_MONGO_READER_HTTP_"
envPrefixAuth = "MG_AUTH_GRPC_"
envPrefixAuthz = "MG_THINGS_AUTH_GRPC_"
defSvcHTTPPort = "9007"
)
@@ -74,7 +76,14 @@ func main() {
repo := newService(db, logger)
ac, acHandler, err := authclient.Setup(svcName)
authConfig := auth.Config{}
if err := env.ParseWithOptions(&cfg, env.Options{Prefix: envPrefixAuth}); err != nil {
logger.Error(fmt.Sprintf("failed to load %s auth configuration : %s", svcName, err))
exitCode = 1
return
}
ac, acHandler, err := auth.Setup(authConfig)
if err != nil {
logger.Fatal(err.Error())
exitCode = 1
@@ -84,7 +93,14 @@ func main() {
logger.Info("Successfully connected to auth grpc server " + acHandler.Secure())
tc, tcHandler, err := authclient.SetupAuthz(svcName)
authConfig = auth.Config{}
if err := env.ParseWithOptions(&cfg, env.Options{Prefix: envPrefixAuthz}); err != nil {
logger.Error(fmt.Sprintf("failed to load %s auth configuration : %s", svcName, err))
exitCode = 1
return
}
tc, tcHandler, err := auth.SetupAuthz(authConfig)
if err != nil {
logger.Error(err.Error())
exitCode = 1
+16 -6
View File
@@ -15,13 +15,13 @@ import (
"time"
"github.com/absmach/magistrala"
authapi "github.com/absmach/magistrala/internal/clients/grpc/auth"
jaegerclient "github.com/absmach/magistrala/internal/clients/jaeger"
"github.com/absmach/magistrala/internal/server"
mglog "github.com/absmach/magistrala/logger"
"github.com/absmach/magistrala/mqtt"
"github.com/absmach/magistrala/mqtt/events"
mqtttracing "github.com/absmach/magistrala/mqtt/tracing"
"github.com/absmach/magistrala/pkg/auth"
"github.com/absmach/magistrala/pkg/errors"
"github.com/absmach/magistrala/pkg/messaging/brokers"
brokerstracing "github.com/absmach/magistrala/pkg/messaging/brokers/tracing"
@@ -37,7 +37,10 @@ import (
"golang.org/x/sync/errgroup"
)
const svcName = "mqtt"
const (
svcName = "mqtt"
envPrefixAuthz = "MG_THINGS_AUTH_GRPC_"
)
type config struct {
LogLevel string `env:"MG_MQTT_ADAPTER_LOG_LEVEL" envDefault:"info"`
@@ -157,17 +160,24 @@ func main() {
return
}
auth, aHandler, err := authapi.SetupAuthz("authz")
authConfig := auth.Config{}
if err := env.ParseWithOptions(&cfg, env.Options{Prefix: envPrefixAuthz}); err != nil {
logger.Error(fmt.Sprintf("failed to load %s auth configuration : %s", svcName, err))
exitCode = 1
return
}
authClient, authHandler, err := auth.SetupAuthz(authConfig)
if err != nil {
logger.Error(err.Error())
exitCode = 1
return
}
defer aHandler.Close()
defer authHandler.Close()
logger.Info("Successfully connected to things grpc server " + aHandler.Secure())
logger.Info("Successfully connected to things grpc server " + authHandler.Secure())
h := mqtt.NewHandler(np, es, logger, auth)
h := mqtt.NewHandler(np, es, logger, authClient)
h = handler.NewTracing(tracer, h)
if cfg.SendTelemetry {
+19 -3
View File
@@ -12,11 +12,11 @@ import (
"github.com/absmach/magistrala"
"github.com/absmach/magistrala/internal"
authclient "github.com/absmach/magistrala/internal/clients/grpc/auth"
pgclient "github.com/absmach/magistrala/internal/clients/postgres"
"github.com/absmach/magistrala/internal/server"
httpserver "github.com/absmach/magistrala/internal/server/http"
mglog "github.com/absmach/magistrala/logger"
"github.com/absmach/magistrala/pkg/auth"
"github.com/absmach/magistrala/pkg/uuid"
"github.com/absmach/magistrala/readers"
"github.com/absmach/magistrala/readers/api"
@@ -31,6 +31,8 @@ const (
svcName = "postgres-reader"
envPrefixDB = "MG_POSTGRES_"
envPrefixHTTP = "MG_POSTGRES_READER_HTTP_"
envPrefixAuth = "MG_AUTH_GRPC_"
envPrefixAuthz = "MG_THINGS_AUTH_GRPC_"
defDB = "magistrala"
defSvcHTTPPort = "9009"
)
@@ -80,7 +82,14 @@ func main() {
}
defer db.Close()
ac, acHandler, err := authclient.Setup(svcName)
authConfig := auth.Config{}
if err := env.ParseWithOptions(&cfg, env.Options{Prefix: envPrefixAuth}); err != nil {
logger.Error(fmt.Sprintf("failed to load %s auth configuration : %s", svcName, err))
exitCode = 1
return
}
ac, acHandler, err := auth.Setup(authConfig)
if err != nil {
logger.Error(err.Error())
exitCode = 1
@@ -90,7 +99,14 @@ func main() {
logger.Info("Successfully connected to auth grpc server " + acHandler.Secure())
tc, tcHandler, err := authclient.SetupAuthz(svcName)
authConfig = auth.Config{}
if err := env.ParseWithOptions(&cfg, env.Options{Prefix: envPrefixAuthz}); err != nil {
logger.Error(fmt.Sprintf("failed to load %s auth configuration : %s", svcName, err))
exitCode = 1
return
}
tc, tcHandler, err := auth.SetupAuthz(authConfig)
if err != nil {
logger.Error(err.Error())
exitCode = 1
+11 -3
View File
@@ -19,12 +19,12 @@ import (
mgsmpp "github.com/absmach/magistrala/consumers/notifiers/smpp"
"github.com/absmach/magistrala/consumers/notifiers/tracing"
"github.com/absmach/magistrala/internal"
authclient "github.com/absmach/magistrala/internal/clients/grpc/auth"
jaegerclient "github.com/absmach/magistrala/internal/clients/jaeger"
pgclient "github.com/absmach/magistrala/internal/clients/postgres"
"github.com/absmach/magistrala/internal/server"
httpserver "github.com/absmach/magistrala/internal/server/http"
mglog "github.com/absmach/magistrala/logger"
"github.com/absmach/magistrala/pkg/auth"
"github.com/absmach/magistrala/pkg/messaging/brokers"
brokerstracing "github.com/absmach/magistrala/pkg/messaging/brokers/tracing"
"github.com/absmach/magistrala/pkg/ulid"
@@ -40,6 +40,7 @@ const (
svcName = "smpp-notifier"
envPrefixDB = "MG_SMPP_NOTIFIER_DB_"
envPrefixHTTP = "MG_SMPP_NOTIFIER_HTTP_"
envPrefixAuth = "MG_AUTH_GRPC_"
defDB = "subscriptions"
defSvcHTTPPort = "9014"
)
@@ -123,7 +124,14 @@ func main() {
defer pubSub.Close()
pubSub = brokerstracing.NewPubSub(httpServerConfig, tracer, pubSub)
auth, authHandler, err := authclient.Setup(svcName)
authConfig := auth.Config{}
if err := env.ParseWithOptions(&cfg, env.Options{Prefix: envPrefixAuth}); err != nil {
logger.Error(fmt.Sprintf("failed to load %s auth configuration : %s", svcName, err))
exitCode = 1
return
}
authClient, authHandler, err := auth.Setup(authConfig)
if err != nil {
logger.Error(err.Error())
exitCode = 1
@@ -132,7 +140,7 @@ func main() {
defer authHandler.Close()
logger.Info("Successfully connected to auth grpc server " + authHandler.Secure())
svc := newService(db, tracer, auth, cfg, smppConfig, logger)
svc := newService(db, tracer, authClient, cfg, smppConfig, logger)
if err = consumers.Start(ctx, svcName, pubSub, svc, cfg.ConfigPath, logger); err != nil {
logger.Error(fmt.Sprintf("failed to create Postgres writer: %s", err))
exitCode = 1
+11 -3
View File
@@ -19,13 +19,13 @@ import (
"github.com/absmach/magistrala/consumers/notifiers/smtp"
"github.com/absmach/magistrala/consumers/notifiers/tracing"
"github.com/absmach/magistrala/internal"
authclient "github.com/absmach/magistrala/internal/clients/grpc/auth"
jaegerclient "github.com/absmach/magistrala/internal/clients/jaeger"
pgclient "github.com/absmach/magistrala/internal/clients/postgres"
"github.com/absmach/magistrala/internal/email"
"github.com/absmach/magistrala/internal/server"
httpserver "github.com/absmach/magistrala/internal/server/http"
mglog "github.com/absmach/magistrala/logger"
"github.com/absmach/magistrala/pkg/auth"
"github.com/absmach/magistrala/pkg/messaging/brokers"
brokerstracing "github.com/absmach/magistrala/pkg/messaging/brokers/tracing"
"github.com/absmach/magistrala/pkg/ulid"
@@ -41,6 +41,7 @@ const (
svcName = "smtp-notifier"
envPrefixDB = "MG_SMTP_NOTIFIER_DB_"
envPrefixHTTP = "MG_SMTP_NOTIFIER_HTTP_"
envPrefixAuth = "MG_AUTH_GRPC_"
defDB = "subscriptions"
defSvcHTTPPort = "9015"
)
@@ -126,7 +127,14 @@ func main() {
defer pubSub.Close()
pubSub = brokerstracing.NewPubSub(httpServerConfig, tracer, pubSub)
auth, authHandler, err := authclient.Setup(svcName)
authConfig := auth.Config{}
if err := env.ParseWithOptions(&cfg, env.Options{Prefix: envPrefixAuth}); err != nil {
logger.Error(fmt.Sprintf("failed to load %s auth configuration : %s", svcName, err))
exitCode = 1
return
}
authClient, authHandler, err := auth.Setup(authConfig)
if err != nil {
logger.Error(err.Error())
exitCode = 1
@@ -136,7 +144,7 @@ func main() {
logger.Info("Successfully connected to auth grpc server " + authHandler.Secure())
svc, err := newService(db, tracer, auth, cfg, ec, logger)
svc, err := newService(db, tracer, authClient, cfg, ec, logger)
if err != nil {
logger.Error(err.Error())
exitCode = 1
+14 -6
View File
@@ -14,7 +14,6 @@ import (
"github.com/absmach/magistrala"
"github.com/absmach/magistrala/internal"
authclient "github.com/absmach/magistrala/internal/clients/grpc/auth"
jaegerclient "github.com/absmach/magistrala/internal/clients/jaeger"
pgclient "github.com/absmach/magistrala/internal/clients/postgres"
redisclient "github.com/absmach/magistrala/internal/clients/redis"
@@ -27,6 +26,7 @@ import (
grpcserver "github.com/absmach/magistrala/internal/server/grpc"
httpserver "github.com/absmach/magistrala/internal/server/http"
mglog "github.com/absmach/magistrala/logger"
"github.com/absmach/magistrala/pkg/auth"
"github.com/absmach/magistrala/pkg/groups"
"github.com/absmach/magistrala/pkg/uuid"
"github.com/absmach/magistrala/things"
@@ -54,6 +54,7 @@ const (
envPrefixDB = "MG_THINGS_DB_"
envPrefixHTTP = "MG_THINGS_HTTP_"
envPrefixGRPC = "MG_THINGS_AUTH_GRPC_"
envPrefixAuth = "MG_AUTH_GRPC_"
defDB = "things"
defSvcHTTPPort = "9000"
defSvcAuthGRPCPort = "7000"
@@ -137,25 +138,32 @@ func main() {
}
defer cacheclient.Close()
var auth magistrala.AuthServiceClient
var authClient magistrala.AuthServiceClient
switch cfg.StandaloneID != "" && cfg.StandaloneToken != "" {
case true:
auth = localusers.NewAuthService(cfg.StandaloneID, cfg.StandaloneToken)
authClient = localusers.NewAuthService(cfg.StandaloneID, cfg.StandaloneToken)
logger.Info("Using standalone auth service")
default:
authServiceClient, authHandler, err := authclient.Setup(svcName)
authConfig := auth.Config{}
if err := env.ParseWithOptions(&cfg, env.Options{Prefix: envPrefixAuth}); err != nil {
logger.Error(fmt.Sprintf("failed to load %s auth configuration : %s", svcName, err))
exitCode = 1
return
}
authServiceClient, authHandler, err := auth.Setup(authConfig)
if err != nil {
logger.Error(err.Error())
exitCode = 1
return
}
defer authHandler.Close()
auth = authServiceClient
authClient = authServiceClient
logger.Info("Successfully connected to auth grpc server " + authHandler.Secure())
}
csvc, gsvc, err := newService(ctx, db, dbConfig, auth, cacheclient, cfg.CacheKeyDuration, cfg.ESURL, tracer, logger)
csvc, gsvc, err := newService(ctx, db, dbConfig, authClient, cacheclient, cfg.CacheKeyDuration, cfg.ESURL, tracer, logger)
if err != nil {
logger.Error(fmt.Sprintf("failed to create services: %s", err))
exitCode = 1
+19 -3
View File
@@ -12,11 +12,11 @@ import (
"github.com/absmach/magistrala"
"github.com/absmach/magistrala/internal"
authclient "github.com/absmach/magistrala/internal/clients/grpc/auth"
pgclient "github.com/absmach/magistrala/internal/clients/postgres"
"github.com/absmach/magistrala/internal/server"
httpserver "github.com/absmach/magistrala/internal/server/http"
mglog "github.com/absmach/magistrala/logger"
"github.com/absmach/magistrala/pkg/auth"
"github.com/absmach/magistrala/pkg/uuid"
"github.com/absmach/magistrala/readers"
"github.com/absmach/magistrala/readers/api"
@@ -31,6 +31,8 @@ const (
svcName = "timescaledb-reader"
envPrefixDB = "MG_TIMESCALE_"
envPrefixHTTP = "MG_TIMESCALE_READER_HTTP_"
envPrefixAuth = "MG_AUTH_GRPC_"
envPrefixAuthz = "MG_THINGS_AUTH_GRPC_"
defDB = "messages"
defSvcHTTPPort = "9011"
)
@@ -80,7 +82,14 @@ func main() {
repo := newService(db, logger)
ac, acHandler, err := authclient.Setup(svcName)
authConfig := auth.Config{}
if err := env.ParseWithOptions(&cfg, env.Options{Prefix: envPrefixAuth}); err != nil {
logger.Error(fmt.Sprintf("failed to load %s auth configuration : %s", svcName, err))
exitCode = 1
return
}
ac, acHandler, err := auth.Setup(authConfig)
if err != nil {
logger.Error(err.Error())
exitCode = 1
@@ -90,7 +99,14 @@ func main() {
logger.Info("Successfully connected to auth grpc server " + acHandler.Secure())
tc, tcHandler, err := authclient.SetupAuthz(svcName)
authConfig = auth.Config{}
if err := env.ParseWithOptions(&cfg, env.Options{Prefix: envPrefixAuthz}); err != nil {
logger.Error(fmt.Sprintf("failed to load %s auth configuration : %s", svcName, err))
exitCode = 1
return
}
tc, tcHandler, err := auth.SetupAuthz(authConfig)
if err != nil {
logger.Error(err.Error())
exitCode = 1
+14 -6
View File
@@ -13,13 +13,13 @@ import (
"github.com/absmach/magistrala"
"github.com/absmach/magistrala/internal"
authclient "github.com/absmach/magistrala/internal/clients/grpc/auth"
jaegerclient "github.com/absmach/magistrala/internal/clients/jaeger"
mongoclient "github.com/absmach/magistrala/internal/clients/mongo"
redisclient "github.com/absmach/magistrala/internal/clients/redis"
"github.com/absmach/magistrala/internal/server"
httpserver "github.com/absmach/magistrala/internal/server/http"
mglog "github.com/absmach/magistrala/logger"
"github.com/absmach/magistrala/pkg/auth"
"github.com/absmach/magistrala/pkg/messaging"
"github.com/absmach/magistrala/pkg/messaging/brokers"
brokerstracing "github.com/absmach/magistrala/pkg/messaging/brokers/tracing"
@@ -43,6 +43,7 @@ const (
svcName = "twins"
envPrefixDB = "MG_TWINS_DB_"
envPrefixHTTP = "MG_TWINS_HTTP_"
envPrefixAuth = "MG_AUTH_GRPC_"
defSvcHTTPPort = "9018"
)
@@ -120,19 +121,26 @@ func main() {
}()
tracer := tp.Tracer(svcName)
var auth magistrala.AuthServiceClient
var authClient magistrala.AuthServiceClient
switch cfg.StandaloneID != "" && cfg.StandaloneToken != "" {
case true:
auth = localusers.NewAuthService(cfg.StandaloneID, cfg.StandaloneToken)
authClient = localusers.NewAuthService(cfg.StandaloneID, cfg.StandaloneToken)
default:
authServiceClient, authHandler, err := authclient.Setup(svcName)
authConfig := auth.Config{}
if err := env.ParseWithOptions(&cfg, env.Options{Prefix: envPrefixAuth}); err != nil {
logger.Error(fmt.Sprintf("failed to load %s auth configuration : %s", svcName, err))
exitCode = 1
return
}
authServiceClient, authHandler, err := auth.Setup(authConfig)
if err != nil {
logger.Error(err.Error())
exitCode = 1
return
}
defer authHandler.Close()
auth = authServiceClient
authClient = authServiceClient
logger.Info("Successfully connected to auth grpc server " + authHandler.Secure())
}
@@ -145,7 +153,7 @@ func main() {
defer pubSub.Close()
pubSub = brokerstracing.NewPubSub(httpServerConfig, tracer, pubSub)
svc, err := newService(ctx, svcName, pubSub, cfg, auth, tracer, db, cacheClient, logger)
svc, err := newService(ctx, svcName, pubSub, cfg, authClient, tracer, db, cacheClient, logger)
if err != nil {
logger.Error(fmt.Sprintf("failed to create %s service: %s", svcName, err))
exitCode = 1
+13 -5
View File
@@ -16,7 +16,6 @@ import (
"github.com/absmach/magistrala"
authSvc "github.com/absmach/magistrala/auth"
"github.com/absmach/magistrala/internal"
authclient "github.com/absmach/magistrala/internal/clients/grpc/auth"
jaegerclient "github.com/absmach/magistrala/internal/clients/jaeger"
pgclient "github.com/absmach/magistrala/internal/clients/postgres"
"github.com/absmach/magistrala/internal/email"
@@ -29,6 +28,7 @@ import (
"github.com/absmach/magistrala/internal/server"
httpserver "github.com/absmach/magistrala/internal/server/http"
mglog "github.com/absmach/magistrala/logger"
"github.com/absmach/magistrala/pkg/auth"
mgclients "github.com/absmach/magistrala/pkg/clients"
"github.com/absmach/magistrala/pkg/errors"
"github.com/absmach/magistrala/pkg/groups"
@@ -53,6 +53,7 @@ const (
envPrefixDB = "MG_USERS_DB_"
envPrefixHTTP = "MG_USERS_HTTP_"
envPrefixGrpc = "MG_USERS_GRPC_"
envPrefixAuth = "MG_AUTH_GRPC_"
defDB = "users"
defSvcHTTPPort = "9002"
defSvcGRPCPort = "9192"
@@ -141,7 +142,14 @@ func main() {
}()
tracer := tp.Tracer(svcName)
auth, authHandler, err := authclient.Setup(svcName)
authConfig := auth.Config{}
if err := env.ParseWithOptions(&cfg, env.Options{Prefix: envPrefixAuth}); err != nil {
logger.Error(fmt.Sprintf("failed to load %s auth configuration : %s", svcName, err))
exitCode = 1
return
}
authClient, authHandler, err := auth.Setup(authConfig)
if err != nil {
logger.Error(err.Error())
exitCode = 1
@@ -150,7 +158,7 @@ func main() {
defer authHandler.Close()
logger.Info("Successfully connected to auth grpc server " + authHandler.Secure())
csvc, gsvc, err := newService(ctx, auth, db, dbConfig, tracer, cfg, ec, logger)
csvc, gsvc, err := newService(ctx, authClient, db, dbConfig, tracer, cfg, ec, logger)
if err != nil {
logger.Error(fmt.Sprintf("failed to setup service: %s", err))
exitCode = 1
@@ -220,7 +228,7 @@ func newService(ctx context.Context, auth magistrala.AuthServiceClient, db *sqlx
counter, latency = internal.MakeMetrics("groups", "api")
gsvc = gapi.MetricsMiddleware(gsvc, counter, latency)
clientID, err := createAdmin(ctx, c, cRepo, hsr, csvc, auth)
clientID, err := createAdmin(ctx, c, cRepo, hsr, csvc)
if err != nil {
logger.Error(fmt.Sprintf("failed to create admin client: %s", err))
}
@@ -230,7 +238,7 @@ func newService(ctx context.Context, auth magistrala.AuthServiceClient, db *sqlx
return csvc, gsvc, err
}
func createAdmin(ctx context.Context, c config, crepo clientspg.Repository, hsr users.Hasher, svc users.Service, auth magistrala.AuthServiceClient) (string, error) {
func createAdmin(ctx context.Context, c config, crepo clientspg.Repository, hsr users.Hasher, svc users.Service) (string, error) {
id, err := uuid.New().ID()
if err != nil {
return "", err
+14 -6
View File
@@ -13,11 +13,11 @@ import (
"github.com/absmach/magistrala"
"github.com/absmach/magistrala/internal"
authapi "github.com/absmach/magistrala/internal/clients/grpc/auth"
jaegerclient "github.com/absmach/magistrala/internal/clients/jaeger"
"github.com/absmach/magistrala/internal/server"
httpserver "github.com/absmach/magistrala/internal/server/http"
mglog "github.com/absmach/magistrala/logger"
"github.com/absmach/magistrala/pkg/auth"
"github.com/absmach/magistrala/pkg/messaging"
"github.com/absmach/magistrala/pkg/messaging/brokers"
brokerstracing "github.com/absmach/magistrala/pkg/messaging/brokers/tracing"
@@ -36,6 +36,7 @@ import (
const (
svcName = "ws-adapter"
envPrefixHTTP = "MG_WS_ADAPTER_HTTP_"
envPrefixAuthz = "MG_THINGS_AUTH_GRPC_"
defSvcHTTPPort = "8190"
targetWSPort = "8191"
targetWSHost = "localhost"
@@ -87,15 +88,22 @@ func main() {
Host: targetWSHost,
}
auth, aHandler, err := authapi.SetupAuthz("authz")
authConfig := auth.Config{}
if err := env.ParseWithOptions(&cfg, env.Options{Prefix: envPrefixAuthz}); err != nil {
logger.Error(fmt.Sprintf("failed to load %s auth configuration : %s", svcName, err))
exitCode = 1
return
}
authClient, authHandler, err := auth.SetupAuthz(authConfig)
if err != nil {
logger.Error(err.Error())
exitCode = 1
return
}
defer aHandler.Close()
defer authHandler.Close()
logger.Info("Successfully connected to things grpc server " + aHandler.Secure())
logger.Info("Successfully connected to things grpc server " + authHandler.Secure())
tp, err := jaegerclient.NewProvider(ctx, svcName, cfg.JaegerURL, cfg.InstanceID, cfg.TraceRatio)
if err != nil {
@@ -119,7 +127,7 @@ func main() {
defer nps.Close()
nps = brokerstracing.NewPubSub(targetServerConf, tracer, nps)
svc := newService(auth, nps, logger, tracer)
svc := newService(authClient, nps, logger, tracer)
hs := httpserver.New(ctx, cancel, svcName, targetServerConf, api.MakeHandler(ctx, svc, logger, cfg.InstanceID), logger)
@@ -132,7 +140,7 @@ func main() {
g.Go(func() error {
return hs.Start()
})
handler := ws.NewHandler(nps, logger, auth)
handler := ws.NewHandler(nps, logger, authClient)
return proxyWS(ctx, httpServerConfig, logger, handler)
})
-48
View File
@@ -1,48 +0,0 @@
// Copyright (c) Magistrala
// SPDX-License-Identifier: Apache-2.0
package auth
import (
"github.com/absmach/magistrala"
authgrpc "github.com/absmach/magistrala/auth/api/grpc"
grpcclient "github.com/absmach/magistrala/internal/clients/grpc"
"github.com/absmach/magistrala/pkg/errors"
thingsauth "github.com/absmach/magistrala/things/api/grpc"
"github.com/caarlos0/env/v10"
)
const (
envAuthGrpcPrefix = "MG_AUTH_GRPC_"
envAuthzGrpcPrefix = "MG_THINGS_AUTH_GRPC_"
)
var errGrpcConfig = errors.New("failed to load grpc configuration")
// Setup loads Auth gRPC configuration from environment variable and creates new Auth gRPC API.
func Setup(svcName string) (magistrala.AuthServiceClient, grpcclient.ClientHandler, error) {
config := grpcclient.Config{}
if err := env.ParseWithOptions(&config, env.Options{Prefix: envAuthGrpcPrefix}); err != nil {
return nil, nil, errors.Wrap(errGrpcConfig, err)
}
c, ch, err := grpcclient.Setup(config, svcName)
if err != nil {
return nil, nil, err
}
return authgrpc.NewClient(c.ClientConn, config.Timeout), ch, nil
}
// Setup loads Auth gRPC configuration from environment variable and creates new Auth gRPC API.
func SetupAuthz(svcName string) (magistrala.AuthzServiceClient, grpcclient.ClientHandler, error) {
config := grpcclient.Config{}
if err := env.ParseWithOptions(&config, env.Options{Prefix: envAuthzGrpcPrefix}); err != nil {
return nil, nil, errors.Wrap(errGrpcConfig, err)
}
c, ch, err := grpcclient.Setup(config, svcName)
if err != nil {
return nil, nil, err
}
return thingsauth.NewClient(c.ClientConn, config.Timeout), ch, nil
}
-6
View File
@@ -1,6 +0,0 @@
// Copyright (c) Magistrala
// SPDX-License-Identifier: Apache-2.0
// Package grpc contains the domain concept definitions needed to support
// Magistrala grpc functionality.
package grpc
-15
View File
@@ -1,15 +0,0 @@
// Copyright (c) Magistrala
// SPDX-License-Identifier: Apache-2.0
package internal
import (
"github.com/absmach/magistrala/internal/clients/grpc"
mglog "github.com/absmach/magistrala/logger"
)
func Close(log mglog.Logger, clientHandler grpc.ClientHandler) {
if err := clientHandler.Close(); err != nil {
log.Warn(err.Error())
}
}
+38
View File
@@ -0,0 +1,38 @@
// Copyright (c) Magistrala
// SPDX-License-Identifier: Apache-2.0
package auth
import (
"github.com/absmach/magistrala"
authgrpc "github.com/absmach/magistrala/auth/api/grpc"
thingsauth "github.com/absmach/magistrala/things/api/grpc"
)
// Setup loads Auth gRPC configuration and creates new Auth gRPC client.
//
// For example:
//
// authClient, authHandler, err := auth.Setup(auth.Config{})
func Setup(cfg Config) (magistrala.AuthServiceClient, Handler, error) {
client, err := newClient(cfg)
if err != nil {
return nil, nil, err
}
return authgrpc.NewClient(client.Connection(), cfg.Timeout), client, nil
}
// Setup loads Authz gRPC configuration and creates new Authz gRPC client.
//
// For example:
//
// authzClient, authzHandler, err := auth.Setup(auth.Config{})
func SetupAuthz(cfg Config) (magistrala.AuthzServiceClient, Handler, error) {
client, err := newClient(cfg)
if err != nil {
return nil, nil, err
}
return thingsauth.NewClient(client.Connection(), cfg.Timeout), client, nil
}
@@ -1,7 +1,7 @@
// Copyright (c) Magistrala
// SPDX-License-Identifier: Apache-2.0
package grpc
package auth
import (
"crypto/tls"
@@ -35,30 +35,82 @@ type Config struct {
ClientCert string `env:"CLIENT_CERT" envDefault:""`
ClientKey string `env:"CLIENT_KEY" envDefault:""`
ServerCAFile string `env:"SERVER_CA_CERTS" envDefault:""`
URL string `env:"URL" envDefault:""`
URL string `env:"URL" envDefault:"localhost:8181"`
Timeout time.Duration `env:"TIMEOUT" envDefault:"1s"`
}
type ClientHandler interface {
// Handler is used to handle gRPC connection.
type Handler interface {
// Close closes gRPC connection.
Close() error
IsSecure() bool
// Secure is used for pretty printing TLS info.
Secure() string
// Connection returns the gRPC connection.
Connection() *grpc.ClientConn
}
type Client struct {
type client struct {
*grpc.ClientConn
cfg Config
secure security
}
var _ ClientHandler = (*Client)(nil)
var _ Handler = (*client)(nil)
// NewClientHandler create new client handler for gRPC client.
func NewClientHandler(c *Client) ClientHandler {
return c
func newClient(cfg Config) (Handler, error) {
conn, secure, err := connect(cfg)
if err != nil {
return nil, err
}
return &client{
ClientConn: conn,
cfg: cfg,
secure: secure,
}, nil
}
// Connect creates new gRPC client and connect to gRPC server.
func Connect(cfg Config) (*grpc.ClientConn, security, error) {
func (c *client) Close() error {
if err := c.ClientConn.Close(); err != nil {
return errors.Wrap(errGrpcClose, err)
}
return nil
}
func (c *client) IsSecure() bool {
switch c.secure {
case withTLS, withmTLS:
return true
case withoutTLS:
fallthrough
default:
return true
}
}
func (c *client) Connection() *grpc.ClientConn {
return c.ClientConn
}
// Secure is used for pretty printing TLS info.
func (c *client) Secure() string {
switch c.secure {
case withTLS:
return "with TLS"
case withmTLS:
return "with mTLS"
case withoutTLS:
fallthrough
default:
return "without TLS"
}
}
// connect creates new gRPC client and connect to gRPC server.
func connect(cfg Config) (*grpc.ClientConn, security, error) {
opts := []grpc.DialOption{
grpc.WithUnaryInterceptor(otelgrpc.UnaryClientInterceptor()),
}
@@ -104,57 +156,7 @@ func Connect(cfg Config) (*grpc.ClientConn, security, error) {
conn, err := grpc.Dial(cfg.URL, opts...)
if err != nil {
return nil, secure, err
return nil, secure, errors.Wrap(errGrpcConnect, err)
}
return conn, secure, nil
}
// Setup load gRPC configuration from environment variable, creates new gRPC client and connect to gRPC server.
func Setup(config Config, svcName string) (*Client, ClientHandler, error) {
// connect to auth grpc server
grpcClient, secure, err := Connect(config)
if err != nil {
return nil, nil, errors.Wrap(errGrpcConnect, err)
}
c := &Client{grpcClient, secure}
return c, NewClientHandler(c), nil
}
// Close shuts down trace provider.
func (c *Client) Close() error {
var retErr error
err := c.ClientConn.Close()
if err != nil {
retErr = errors.Wrap(errGrpcClose, err)
}
return retErr
}
// IsSecure is utility method for checking if
// the client is running with TLS enabled.
func (c *Client) IsSecure() bool {
switch c.secure {
case withTLS, withmTLS:
return true
case withoutTLS:
fallthrough
default:
return true
}
}
// Secure is used for pretty printing TLS info.
func (c *Client) Secure() string {
switch c.secure {
case withTLS:
return "with TLS"
case withmTLS:
return "with mTLS"
case withoutTLS:
fallthrough
default:
return "without TLS"
}
}
+6
View File
@@ -0,0 +1,6 @@
// Copyright (c) Magistrala
// SPDX-License-Identifier: Apache-2.0
// Package auth contains the domain concept definitions needed to support
// Magistrala auth functionality.
package auth
+3
View File
@@ -1,3 +1,6 @@
// Copyright (c) Magistrala
// SPDX-License-Identifier: Apache-2.0
package senml
// Message represents a resolved (normalized) SenML record.
+1 -1
View File
@@ -224,7 +224,7 @@ func (h *handler) Disconnect(ctx context.Context) error {
func (h *handler) authAccess(ctx context.Context, password, topic, action string) error {
// Topics are in the format:
// channels/<channel_id>/messages/<subtopic>/.../ct/<content_type>
if !channelRegExp.Match([]byte(topic)) {
if !channelRegExp.MatchString(topic) {
return ErrMalformedTopic
}