Skip to content

Commit c3c9bfb

Browse files
author
Benjamin A. Stockwell
committedApr 19, 2021
A little command line tool to generate request signatures, i.e. for creating test data/fixtures or testing signature validation code.
1 parent 348c2fc commit c3c9bfb

File tree

2 files changed

+78
-0
lines changed

2 files changed

+78
-0
lines changed
 

‎Dockerfile

+1
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,7 @@ RUN go mod download
1616
COPY . .
1717
RUN cd cmd/sso-auth && go build -mod=readonly -o /bin/sso-auth
1818
RUN cd cmd/sso-proxy && go build -mod=readonly -o /bin/sso-proxy
19+
RUN cd cmd/sso-proxy/generate-request-signature && go build -mod=readonly -o /bin/sso-generate-request-signature
1920

2021
# =============================================================================
2122
# final stage
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,77 @@
1+
package main
2+
3+
import (
4+
"flag"
5+
"fmt"
6+
"net/http"
7+
"os"
8+
"strings"
9+
10+
"github.com/buzzfeed/sso/internal/pkg/logging"
11+
"github.com/buzzfeed/sso/internal/proxy"
12+
)
13+
14+
// Name of the header used to transmit the signature computed for the request.
15+
var signatureHeader = "Sso-Signature"
16+
var signingKeyHeader = "kid"
17+
18+
func main() {
19+
logger := logging.NewLogEntry()
20+
var requestSigner *proxy.RequestSigner
21+
22+
config, err := proxy.LoadConfig()
23+
if err != nil {
24+
logger.Error(err, "error loading in config from env vars")
25+
os.Exit(1)
26+
}
27+
28+
urlPtr := flag.String("url", "", "URL of request to sign")
29+
methodPtr := flag.String("method", "GET", "Method of request to sign")
30+
bodyPtr := flag.String("body", "", "Body of request to sign")
31+
32+
err = config.Validate()
33+
if err != nil {
34+
logger.Error(err, "error validating config")
35+
os.Exit(1)
36+
}
37+
38+
requestSigner, err = proxy.NewRequestSigner(config.RequestSignerConfig.Key)
39+
if err != nil {
40+
logger.Error(err, "error creating request signer")
41+
os.Exit(1)
42+
}
43+
44+
flag.Parse()
45+
args := flag.Args()
46+
47+
requestBody := *strings.NewReader(*bodyPtr)
48+
49+
req, err := http.NewRequest(*methodPtr, *urlPtr, &requestBody)
50+
if err != nil {
51+
logger.Error(err, "error creating request")
52+
os.Exit(1)
53+
}
54+
55+
for _, h := range args {
56+
hKv := strings.Split(h, ":")
57+
req.Header.Set(hKv[0], hKv[1])
58+
}
59+
60+
err = requestSigner.Sign(req)
61+
if err != nil {
62+
logger.Error(err, "error signing request")
63+
os.Exit(1)
64+
}
65+
66+
signature := req.Header.Get(signatureHeader)
67+
keyHeader := req.Header.Get(signingKeyHeader)
68+
69+
fmt.Printf("URL: %v\n", *urlPtr)
70+
fmt.Printf("method: %v\n", *methodPtr)
71+
fmt.Printf("body: %v\n", *bodyPtr)
72+
fmt.Printf("headers: %v\n", req.Header)
73+
fmt.Println("==================================================================")
74+
75+
fmt.Printf("signature: %v\n", signature)
76+
fmt.Printf("keyHeader: %v\n", keyHeader)
77+
}

0 commit comments

Comments
 (0)