fix: op handler as http.Handler

This commit is contained in:
Livio Amstutz 2020-07-06 10:34:58 +02:00
parent 320dd41137
commit 653540c27d
4 changed files with 17 additions and 39 deletions

View file

@ -15,20 +15,27 @@ import (
func main() { func main() {
ctx := context.Background() ctx := context.Background()
port := "9998"
config := &op.Config{ config := &op.Config{
Issuer: "http://localhost:9998/", Issuer: "http://localhost:9998/",
CryptoKey: sha256.Sum256([]byte("test")), CryptoKey: sha256.Sum256([]byte("test")),
Port: "9998",
} }
storage := mock.NewAuthStorage() storage := mock.NewAuthStorage()
handler, err := op.NewDefaultOP(ctx, config, storage, op.WithCustomTokenEndpoint(op.NewEndpoint("test"))) handler, err := op.NewDefaultOP(ctx, config, storage, op.WithCustomTokenEndpoint(op.NewEndpoint("test")))
if err != nil { if err != nil {
log.Fatal(err) log.Fatal(err)
} }
router := handler.HttpHandler().Handler.(*mux.Router) router := handler.HttpHandler().(*mux.Router)
router.Methods("GET").Path("/login").HandlerFunc(HandleLogin) router.Methods("GET").Path("/login").HandlerFunc(HandleLogin)
router.Methods("POST").Path("/login").HandlerFunc(HandleCallback) router.Methods("POST").Path("/login").HandlerFunc(HandleCallback)
op.Start(ctx, handler) server := &http.Server{
Addr: ":" + port,
Handler: router,
}
err = server.ListenAndServe()
if err != nil {
log.Fatal(err)
}
<-ctx.Done() <-ctx.Done()
} }

View file

@ -16,8 +16,6 @@ type Configuration interface {
KeysEndpoint() Endpoint KeysEndpoint() Endpoint
AuthMethodPostSupported() bool AuthMethodPostSupported() bool
Port() string
} }
func ValidateIssuer(issuer string) error { func ValidateIssuer(issuer string) error {

View file

@ -10,6 +10,7 @@ import (
"gopkg.in/square/go-jose.v2" "gopkg.in/square/go-jose.v2"
"github.com/caos/logging" "github.com/caos/logging"
"github.com/caos/oidc/pkg/oidc" "github.com/caos/oidc/pkg/oidc"
"github.com/caos/oidc/pkg/rp" "github.com/caos/oidc/pkg/rp"
) )
@ -45,7 +46,7 @@ type DefaultOP struct {
signer Signer signer Signer
verifier rp.Verifier verifier rp.Verifier
crypto Crypto crypto Crypto
http *http.Server http http.Handler
decoder *schema.Decoder decoder *schema.Decoder
encoder *schema.Encoder encoder *schema.Encoder
interceptor HttpInterceptor interceptor HttpInterceptor
@ -64,7 +65,6 @@ type Config struct {
// IdTokenSigningAlgValuesSupported: []string{keys.SigningAlgorithm}, // IdTokenSigningAlgValuesSupported: []string{keys.SigningAlgorithm},
// SubjectTypesSupported: []string{"public"}, // SubjectTypesSupported: []string{"public"},
// TokenEndpointAuthMethodsSupported: // TokenEndpointAuthMethodsSupported:
Port string
} }
type endpoints struct { type endpoints struct {
@ -180,13 +180,10 @@ func NewDefaultOP(ctx context.Context, config *Config, storage Storage, opOpts .
p.signer = NewDefaultSigner(ctx, storage, keyCh) p.signer = NewDefaultSigner(ctx, storage, keyCh)
go p.ensureKey(ctx, storage, keyCh, p.timer) go p.ensureKey(ctx, storage, keyCh, p.timer)
p.verifier = rp.NewDefaultVerifier(config.Issuer, "", p, rp.WithIgnoreAudience()) p.verifier = rp.NewDefaultVerifier(config.Issuer, "", p, rp.WithIgnoreAudience(), rp.WithIgnoreExpiration())
p.http = CreateRouter(p, p.interceptor)
router := CreateRouter(p, p.interceptor)
p.http = &http.Server{
Addr: ":" + config.Port,
Handler: router,
}
p.decoder = schema.NewDecoder() p.decoder = schema.NewDecoder()
p.decoder.IgnoreUnknownKeys(true) p.decoder.IgnoreUnknownKeys(true)
@ -225,11 +222,7 @@ func (p *DefaultOP) AuthMethodPostSupported() bool {
return true //TODO: config return true //TODO: config
} }
func (p *DefaultOP) Port() string { func (p *DefaultOP) HttpHandler() http.Handler {
return p.config.Port
}
func (p *DefaultOP) HttpHandler() *http.Server {
return p.http return p.http
} }

View file

@ -1,12 +1,10 @@
package op package op
import ( import (
"context"
"net/http" "net/http"
"github.com/gorilla/handlers" "github.com/gorilla/handlers"
"github.com/gorilla/mux" "github.com/gorilla/mux"
"github.com/sirupsen/logrus"
"github.com/caos/oidc/pkg/oidc" "github.com/caos/oidc/pkg/oidc"
) )
@ -26,7 +24,7 @@ type OpenIDProvider interface {
HandleUserinfo(w http.ResponseWriter, r *http.Request) HandleUserinfo(w http.ResponseWriter, r *http.Request)
HandleEndSession(w http.ResponseWriter, r *http.Request) HandleEndSession(w http.ResponseWriter, r *http.Request)
HandleKeys(w http.ResponseWriter, r *http.Request) HandleKeys(w http.ResponseWriter, r *http.Request)
HttpHandler() *http.Server HttpHandler() http.Handler
} }
type HttpInterceptor func(http.HandlerFunc) http.HandlerFunc type HttpInterceptor func(http.HandlerFunc) http.HandlerFunc
@ -54,21 +52,3 @@ func CreateRouter(o OpenIDProvider, h HttpInterceptor) *mux.Router {
router.HandleFunc(o.KeysEndpoint().Relative(), o.HandleKeys) router.HandleFunc(o.KeysEndpoint().Relative(), o.HandleKeys)
return router return router
} }
func Start(ctx context.Context, o OpenIDProvider) {
go func() {
<-ctx.Done()
err := o.HttpHandler().Shutdown(ctx)
if err != nil {
logrus.Error("graceful shutdown of oidc server failed")
}
}()
go func() {
err := o.HttpHandler().ListenAndServe()
if err != nil {
logrus.Panicf("oidc server serve failed: %v", err)
}
}()
logrus.Infof("oidc server is listening on %s", o.Port())
}