Skip to content

Commit

Permalink
add key auth for admin endpoints
Browse files Browse the repository at this point in the history
  • Loading branch information
spikelu2016 committed Jan 26, 2024
1 parent 1c8b93f commit afc10cb
Show file tree
Hide file tree
Showing 8 changed files with 27 additions and 7 deletions.
3 changes: 2 additions & 1 deletion .gitignore
Original file line number Diff line number Diff line change
@@ -1,2 +1,3 @@
release_notes.md
target
target
.DS_STORE
4 changes: 4 additions & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
@@ -1,3 +1,7 @@
## 1.8.0 - 2024-01-17
### Added
- Added key authentication for admin endpoints

## 1.7.6 - 2024-01-17
### Fixed
- Changed code to string in OpenAI error response
Expand Down
10 changes: 9 additions & 1 deletion README.md
Original file line number Diff line number Diff line change
Expand Up @@ -145,10 +145,18 @@ docker pull luyuanxin1995/bricksllm:1.4.0
> | `REDIS_WRITE_TIME_OUT` | optional | Timeout for Redis write operations | `500ms`
> | `IN_MEMORY_DB_UPDATE_INTERVAL` | optional | The interval BricksLLM API gateway polls Postgresql DB for latest key configurations | `1s`
> | `STATS_PROVIDER` | optional | This value can only be datadog. Required for integration with Datadog. |
> | `PROXY_TIMEOUT` | optional | This value can only be datadog. Required for integration with Datadog. |
> | `PROXY_TIMEOUT` | optional | Timeout for proxy HTTP requests. |
> | `ADMIN_PASS` | optional | Simple password authentication for admin endpoints. |
## Configuration Endpoints
The configuration server runs on Port `8001`.

##### Headers
> | name | type | data type | description |
> |--------|------------|----------------|------------------------------------------------------|
> | `X-API-KEY` | optional | `string` | Key authentication header.

<details>
<summary>Get keys: <code>GET</code> <code><b>/api/key-management/keys</b></code></summary>

Expand Down
2 changes: 1 addition & 1 deletion cmd/bricksllm/main.go
Original file line number Diff line number Diff line change
Expand Up @@ -182,7 +182,7 @@ func main() {
cpm := manager.NewCustomProvidersManager(store, cpMemStore)
rm := manager.NewRouteManager(store, store, rMemStore, psMemStore)

as, err := admin.NewAdminServer(log, *modePtr, m, krm, psm, cpm, rm)
as, err := admin.NewAdminServer(log, *modePtr, m, krm, psm, cpm, rm, cfg.AdminPass)
if err != nil {
log.Sugar().Fatalf("error creating admin http server: %v", err)
}
Expand Down
2 changes: 1 addition & 1 deletion cmd/tool/main.go
Original file line number Diff line number Diff line change
Expand Up @@ -181,7 +181,7 @@ func main() {
cpm := manager.NewCustomProvidersManager(store, cpMemStore)
rm := manager.NewRouteManager(store, store, rMemStore, psMemStore)

as, err := admin.NewAdminServer(log, *modePtr, m, krm, psm, cpm, rm)
as, err := admin.NewAdminServer(log, *modePtr, m, krm, psm, cpm, rm, cfg.AdminPass)
if err != nil {
log.Sugar().Fatalf("error creating admin http server: %v", err)
}
Expand Down
1 change: 1 addition & 0 deletions internal/config/config.go
Original file line number Diff line number Diff line change
Expand Up @@ -24,6 +24,7 @@ type Config struct {
InMemoryDbUpdateInterval time.Duration `env:"IN_MEMORY_DB_UPDATE_INTERVAL" envDefault:"5s"`
OpenAiKey string `env:"OPENAI_API_KEY"`
StatsProvider string `env:"STATS_PROVIDER"`
AdminPass string `env:"ADMIN_PASS"`
ProxyTimeout time.Duration `env:"PROXY_TIMEOUT" envDefault:"180s"`
}

Expand Down
4 changes: 2 additions & 2 deletions internal/server/web/admin/admin.go
Original file line number Diff line number Diff line change
Expand Up @@ -55,11 +55,11 @@ type AdminServer struct {
m KeyManager
}

func NewAdminServer(log *zap.Logger, mode string, m KeyManager, krm KeyReportingManager, psm ProviderSettingsManager, cpm CustomProvidersManager, rm RouteManager) (*AdminServer, error) {
func NewAdminServer(log *zap.Logger, mode string, m KeyManager, krm KeyReportingManager, psm ProviderSettingsManager, cpm CustomProvidersManager, rm RouteManager, adminPass string) (*AdminServer, error) {
router := gin.New()

prod := mode == "production"
router.Use(getAdminLoggerMiddleware(log, "admin", prod))
router.Use(getAdminLoggerMiddleware(log, "admin", prod, adminPass))

router.GET("/api/health", getGetHealthCheckHandler())

Expand Down
8 changes: 7 additions & 1 deletion internal/server/web/admin/middleware.go
Original file line number Diff line number Diff line change
Expand Up @@ -8,8 +8,14 @@ import (
"go.uber.org/zap"
)

func getAdminLoggerMiddleware(log *zap.Logger, prefix string, prod bool) gin.HandlerFunc {
func getAdminLoggerMiddleware(log *zap.Logger, prefix string, prod bool, adminPass string) gin.HandlerFunc {
return func(c *gin.Context) {
if len(adminPass) != 0 && c.Request.Header.Get("X-API-KEY") != adminPass {
c.Status(200)
c.Abort()
return
}

c.Set(correlationId, util.NewUuid())
start := time.Now()
c.Next()
Expand Down

0 comments on commit afc10cb

Please sign in to comment.