Skip to content

Commit a0a9ddd

Browse files
easyCZroboquat
authored andcommitted
[public-api] Use personal access token signing key
1 parent b30941b commit a0a9ddd

File tree

3 files changed

+26
-9
lines changed

3 files changed

+26
-9
lines changed

components/public-api-server/pkg/apiv1/tokens.go

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -24,18 +24,20 @@ import (
2424
"gorm.io/gorm"
2525
)
2626

27-
func NewTokensService(connPool proxy.ServerConnectionPool, expClient experiments.Client, dbConn *gorm.DB) *TokensService {
27+
func NewTokensService(connPool proxy.ServerConnectionPool, expClient experiments.Client, dbConn *gorm.DB, signer auth.Signer) *TokensService {
2828
return &TokensService{
2929
connectionPool: connPool,
3030
expClient: expClient,
3131
dbConn: dbConn,
32+
signer: signer,
3233
}
3334
}
3435

3536
type TokensService struct {
3637
connectionPool proxy.ServerConnectionPool
3738
expClient experiments.Client
3839
dbConn *gorm.DB
40+
signer auth.Signer
3941

4042
v1connect.UnimplementedTokensServiceHandler
4143
}

components/public-api-server/pkg/apiv1/tokens_test.go

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -370,13 +370,14 @@ func setupTokensService(t *testing.T, expClient experiments.Client) (*protocol.M
370370
t.Helper()
371371

372372
dbConn := dbtest.ConnectForTests(t)
373+
signer := auth.NewHS256Signer([]byte("my-secret"))
373374

374375
ctrl := gomock.NewController(t)
375376
t.Cleanup(ctrl.Finish)
376377

377378
serverMock := protocol.NewMockAPIInterface(ctrl)
378379

379-
svc := NewTokensService(&FakeServerConnPool{api: serverMock}, expClient, dbConn)
380+
svc := NewTokensService(&FakeServerConnPool{api: serverMock}, expClient, dbConn, signer)
380381

381382
_, handler := v1connect.NewTokensServiceHandler(svc, connect.WithInterceptors(auth.NewServerInterceptor()))
382383

components/public-api-server/pkg/server/server.go

Lines changed: 21 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -75,7 +75,7 @@ func Start(logger *logrus.Entry, version string, cfg *config.Configuration) erro
7575

7676
var stripeWebhookHandler http.Handler = webhooks.NewNoopWebhookHandler()
7777
if cfg.StripeWebhookSigningSecretPath != "" {
78-
stripeWebhookSecret, err := readStripeWebhookSecret(cfg.StripeWebhookSigningSecretPath)
78+
stripeWebhookSecret, err := readSecretFromFile(cfg.StripeWebhookSigningSecretPath)
7979
if err != nil {
8080
return fmt.Errorf("failed to read stripe secret: %w", err)
8181
}
@@ -84,9 +84,21 @@ func Start(logger *logrus.Entry, version string, cfg *config.Configuration) erro
8484
log.Info("No stripe webhook secret is configured, endpoints will return NotImplemented")
8585
}
8686

87+
var signer auth.Signer
88+
if cfg.PersonalAccessTokenSigningKeyPath != "" {
89+
personalACcessTokenSigningKey, err := readSecretFromFile(cfg.PersonalAccessTokenSigningKeyPath)
90+
if err != nil {
91+
return fmt.Errorf("failed to read personal access token signing key: %w", err)
92+
}
93+
94+
signer = auth.NewHS256Signer([]byte(personalACcessTokenSigningKey))
95+
} else {
96+
log.Info("No Personal Access Token signign key specified, PersonalAccessToken service will be disabled.")
97+
}
98+
8799
srv.HTTPMux().Handle("/stripe/invoices/webhook", handlers.ContentTypeHandler(stripeWebhookHandler, "application/json"))
88100

89-
if registerErr := register(srv, connPool, expClient, dbConn); registerErr != nil {
101+
if registerErr := register(srv, connPool, expClient, dbConn, signer); registerErr != nil {
90102
return fmt.Errorf("failed to register services: %w", registerErr)
91103
}
92104

@@ -97,7 +109,7 @@ func Start(logger *logrus.Entry, version string, cfg *config.Configuration) erro
97109
return nil
98110
}
99111

100-
func register(srv *baseserver.Server, connPool proxy.ServerConnectionPool, expClient experiments.Client, dbConn *gorm.DB) error {
112+
func register(srv *baseserver.Server, connPool proxy.ServerConnectionPool, expClient experiments.Client, dbConn *gorm.DB, signer auth.Signer) error {
101113
proxy.RegisterMetrics(srv.MetricsRegistry())
102114

103115
connectMetrics := NewConnectMetrics()
@@ -120,8 +132,10 @@ func register(srv *baseserver.Server, connPool proxy.ServerConnectionPool, expCl
120132
teamsRoute, teamsServiceHandler := v1connect.NewTeamsServiceHandler(apiv1.NewTeamsService(connPool), handlerOptions...)
121133
srv.HTTPMux().Handle(teamsRoute, teamsServiceHandler)
122134

123-
tokensRoute, tokensServiceHandler := v1connect.NewTokensServiceHandler(apiv1.NewTokensService(connPool, expClient, dbConn), handlerOptions...)
124-
srv.HTTPMux().Handle(tokensRoute, tokensServiceHandler)
135+
if signer != nil {
136+
tokensRoute, tokensServiceHandler := v1connect.NewTokensServiceHandler(apiv1.NewTokensService(connPool, expClient, dbConn, signer), handlerOptions...)
137+
srv.HTTPMux().Handle(tokensRoute, tokensServiceHandler)
138+
}
125139

126140
userRoute, userServiceHandler := v1connect.NewUserServiceHandler(apiv1.NewUserService(connPool), handlerOptions...)
127141
srv.HTTPMux().Handle(userRoute, userServiceHandler)
@@ -132,10 +146,10 @@ func register(srv *baseserver.Server, connPool proxy.ServerConnectionPool, expCl
132146
return nil
133147
}
134148

135-
func readStripeWebhookSecret(path string) (string, error) {
149+
func readSecretFromFile(path string) (string, error) {
136150
b, err := os.ReadFile(path)
137151
if err != nil {
138-
return "", fmt.Errorf("failed to read stripe webhook secret: %w", err)
152+
return "", fmt.Errorf("failed to read secret from file: %w", err)
139153
}
140154

141155
return strings.TrimSpace(string(b)), nil

0 commit comments

Comments
 (0)