summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authormo khan <mo@mokhan.ca>2022-04-13 18:50:35 -0600
committermo khan <mo@mokhan.ca>2022-04-13 18:50:35 -0600
commit4c279789b1958f1be5c0cab18b96292309cd0c15 (patch)
tree333834d794db701791837d8e656f53d9aa343d71
parentfdbe99de5987622c9133a52d53c882002c94b18d (diff)
implement jwks endpoint
-rwxr-xr-xsrc/oidc/bin/00_metadata3
-rw-r--r--src/oidc/go.mod16
-rw-r--r--src/oidc/go.sum37
-rw-r--r--src/oidc/main.go17
4 files changed, 70 insertions, 3 deletions
diff --git a/src/oidc/bin/00_metadata b/src/oidc/bin/00_metadata
index 06ad71a..857fa40 100755
--- a/src/oidc/bin/00_metadata
+++ b/src/oidc/bin/00_metadata
@@ -3,4 +3,5 @@
set -e
cd "$(dirname "$0")/.."
-curl -s "http://localhost:8282/.well-known/openid-configuration"
+curl -s "http://localhost:8282/.well-known/openid-configuration" | jq '.'
+curl -s "http://localhost:8282/.well-known/jwks.json" | jq '.'
diff --git a/src/oidc/go.mod b/src/oidc/go.mod
index 87be84c..9a421fc 100644
--- a/src/oidc/go.mod
+++ b/src/oidc/go.mod
@@ -4,4 +4,18 @@ go 1.18
require github.com/google/uuid v1.3.0
-require github.com/golang-jwt/jwt v3.2.2+incompatible
+require (
+ github.com/golang-jwt/jwt v3.2.2+incompatible
+ github.com/lestrrat-go/jwx/v2 v2.0.0-beta1
+)
+
+require (
+ github.com/decred/dcrd/dcrec/secp256k1/v4 v4.0.1 // indirect
+ github.com/goccy/go-json v0.9.6 // indirect
+ github.com/lestrrat-go/blackmagic v1.0.1 // indirect
+ github.com/lestrrat-go/httpcc v1.0.1 // indirect
+ github.com/lestrrat-go/httprc v1.0.1 // indirect
+ github.com/lestrrat-go/iter v1.0.2 // indirect
+ github.com/lestrrat-go/option v1.0.0 // indirect
+ golang.org/x/crypto v0.0.0-20220214200702-86341886e292 // indirect
+)
diff --git a/src/oidc/go.sum b/src/oidc/go.sum
index 9fb2128..8abdeef 100644
--- a/src/oidc/go.sum
+++ b/src/oidc/go.sum
@@ -1,4 +1,41 @@
+github.com/davecgh/go-spew v1.1.0 h1:ZDRjVQ15GmhC3fiQ8ni8+OwkZQO4DARzQgrnXU1Liz8=
+github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
+github.com/decred/dcrd/crypto/blake256 v1.0.0/go.mod h1:sQl2p6Y26YV+ZOcSTP6thNdn47hh8kt6rqSlvmrXFAc=
+github.com/decred/dcrd/dcrec/secp256k1/v4 v4.0.1 h1:YLtO71vCjJRCBcrPMtQ9nqBsqpA1m5sE92cU+pd5Mcc=
+github.com/decred/dcrd/dcrec/secp256k1/v4 v4.0.1/go.mod h1:hyedUtir6IdtD/7lIxGeCxkaw7y45JueMRL4DIyJDKs=
+github.com/goccy/go-json v0.9.6 h1:5/4CtRQdtsX0sal8fdVhTaiMN01Ri8BExZZ8iRmHQ6E=
+github.com/goccy/go-json v0.9.6/go.mod h1:6MelG93GURQebXPDq3khkgXZkazVtN9CRI+MGFi0w8I=
github.com/golang-jwt/jwt v3.2.2+incompatible h1:IfV12K8xAKAnZqdXVzCZ+TOjboZ2keLg81eXfW3O+oY=
github.com/golang-jwt/jwt v3.2.2+incompatible/go.mod h1:8pz2t5EyA70fFQQSrl6XZXzqecmYZeUEB8OUGHkxJ+I=
github.com/google/uuid v1.3.0 h1:t6JiXgmwXMjEs8VusXIJk2BXHsn+wx8BZdTaoZ5fu7I=
github.com/google/uuid v1.3.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo=
+github.com/lestrrat-go/blackmagic v1.0.1 h1:lS5Zts+5HIC/8og6cGHb0uCcNCa3OUt1ygh3Qz2Fe80=
+github.com/lestrrat-go/blackmagic v1.0.1/go.mod h1:UrEqBzIR2U6CnzVyUtfM6oZNMt/7O7Vohk2J0OGSAtU=
+github.com/lestrrat-go/httpcc v1.0.1 h1:ydWCStUeJLkpYyjLDHihupbn2tYmZ7m22BGkcvZZrIE=
+github.com/lestrrat-go/httpcc v1.0.1/go.mod h1:qiltp3Mt56+55GPVCbTdM9MlqhvzyuL6W/NMDA8vA5E=
+github.com/lestrrat-go/httprc v1.0.1 h1:Cnc4NxIySph38pQPzKbjg5OkKsGR/Cf5xcWt5OlSUDI=
+github.com/lestrrat-go/httprc v1.0.1/go.mod h1:5Ml+nB++j6IC0e6LzefJnrpMQDKgDwDCaIQQzhbqhJM=
+github.com/lestrrat-go/iter v1.0.2 h1:gMXo1q4c2pHmC3dn8LzRhJfP1ceCbgSiT9lUydIzltI=
+github.com/lestrrat-go/iter v1.0.2/go.mod h1:Momfcq3AnRlRjI5b5O8/G5/BvpzrhoFTZcn06fEOPt4=
+github.com/lestrrat-go/jwx/v2 v2.0.0-beta1 h1:zVHfLjzsWPjAF21CdoTCV3x7X3zixSi3kTXBLmbSI4Y=
+github.com/lestrrat-go/jwx/v2 v2.0.0-beta1/go.mod h1:G8yN95iNzKc/y82IpU2MW+mOeGrDm5j773pE5M0w/7w=
+github.com/lestrrat-go/option v1.0.0 h1:WqAWL8kh8VcSoD6xjSH34/1m8yxluXQbDeKNfvFeEO4=
+github.com/lestrrat-go/option v1.0.0/go.mod h1:5ZHFbivi4xwXxhxY9XHDe2FHo6/Z7WWmtT7T5nBBp3I=
+github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM=
+github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4=
+github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME=
+github.com/stretchr/testify v1.6.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg=
+github.com/stretchr/testify v1.7.1 h1:5TQK59W5E3v0r2duFAb7P95B6hEeOyEnHRa8MjYSMTY=
+github.com/stretchr/testify v1.7.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg=
+golang.org/x/crypto v0.0.0-20220214200702-86341886e292 h1:f+lwQ+GtmgoY+A2YaQxlSOnDjXcQ7ZRLWOHbC6HtRqE=
+golang.org/x/crypto v0.0.0-20220214200702-86341886e292/go.mod h1:IxCIyHEi3zRg3s0A5j5BB6A9Jmi73HwBIUl50j+osU4=
+golang.org/x/net v0.0.0-20211112202133-69e39bad7dc2/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y=
+golang.org/x/sys v0.0.0-20201119102817-f84b799fce68/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
+golang.org/x/sys v0.0.0-20210423082822-04245dca01da/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
+golang.org/x/sys v0.0.0-20210615035016-665e8c7367d1/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
+golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo=
+golang.org/x/text v0.3.6/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ=
+golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=
+gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=
+gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c h1:dUUwHk2QECo/6vqA44rthZ8ie2QXMNeKRTHCNY2nXvo=
+gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=
diff --git a/src/oidc/main.go b/src/oidc/main.go
index 9f9d71c..3c9f057 100644
--- a/src/oidc/main.go
+++ b/src/oidc/main.go
@@ -1,6 +1,9 @@
package main
import (
+ "crypto/x509"
+ "encoding/json"
+ "encoding/pem"
"fmt"
"io/ioutil"
"log"
@@ -10,6 +13,7 @@ import (
"github.com/golang-jwt/jwt"
"github.com/google/uuid"
+ "github.com/lestrrat-go/jwx/v2/jwk"
)
type AuthorizationRequest struct {
@@ -126,7 +130,18 @@ func handler(w http.ResponseWriter, r *http.Request) {
} else if r.URL.Path == "/userinfo" {
w.WriteHeader(http.StatusNotImplemented)
} else if r.URL.Path == "/.well-known/jwks.json" {
- w.WriteHeader(http.StatusNotImplemented)
+ w.Header().Set("Content-Type", "application/json")
+ keyData, _ := ioutil.ReadFile("insecure.pem")
+ privatePem, _ := pem.Decode(keyData)
+ parsedKey, _ := x509.ParsePKCS1PrivateKey(privatePem.Bytes)
+ key, _ := jwk.FromRaw(parsedKey)
+ pubKey, _ := jwk.PublicKeyOf(key)
+ pubKey.Set(jwk.KeyIDKey, "X")
+ pubKey.Set(jwk.KeyUsageKey, "sig")
+
+ set := jwk.NewSet()
+ set.Add(pubKey)
+ json.NewEncoder(w).Encode(set)
} else if r.URL.Path == "/revoke" {
w.WriteHeader(http.StatusNotImplemented)
} else {