Passed
Push — main ( f24a32...53c867 )
by Acho
03:11
created

api/pkg/middlewares/phone_api_key_auth_middleware.go   A

Size/Duplication

Total Lines 35
Duplicated Lines 0 %

Importance

Changes 0
Metric Value
cc 6
eloc 24
dl 0
loc 35
rs 10
c 0
b 0
f 0

1 Method

Rating   Name   Duplication   Size   Complexity  
B middlewares.PhoneAPIKeyAuth 0 22 6
1
package middlewares
2
3
import (
4
	"fmt"
5
	"strings"
6
7
	"github.com/NdoleStudio/httpsms/pkg/repositories"
8
	"github.com/NdoleStudio/httpsms/pkg/telemetry"
9
	"github.com/gofiber/fiber/v2"
10
	"github.com/palantir/stacktrace"
11
)
12
13
// PhoneAPIKeyAuth authenticates a user from the X-API-Key header
14
func PhoneAPIKeyAuth(logger telemetry.Logger, tracer telemetry.Tracer, repository repositories.PhoneAPIKeyRepository) fiber.Handler {
15
	logger = logger.WithService("middlewares.APIKeyAuth")
16
17
	return func(c *fiber.Ctx) error {
18
		ctx, span, ctxLogger := tracer.StartFromFiberCtxWithLogger(c, logger, "middlewares.APIKeyAuth")
19
		defer span.End()
20
21
		apiKey := c.Get(authHeaderAPIKey)
22
		if len(apiKey) == 0 || apiKey == "undefined" || !strings.HasPrefix(apiKey, "pk_") {
23
			span.AddEvent(fmt.Sprintf("the request header has no [%s] header for the phone key", authHeaderAPIKey))
24
			return c.Next()
25
		}
26
27
		authUser, err := repository.LoadAuthContext(ctx, apiKey)
28
		if err != nil {
29
			ctxLogger.Error(stacktrace.Propagate(err, fmt.Sprintf("cannot load user with phone api key [%s]", apiKey)))
30
			return c.Next()
31
		}
32
33
		c.Locals(ContextKeyAuthUserID, authUser)
34
		ctxLogger.Info(fmt.Sprintf("[%T] set successfully for user with ID [%s]", authUser, authUser.ID))
35
		return c.Next()
36
	}
37
}
38