mirror of
https://github.com/andwati/zitadel.git
synced 2026-11-12 09:05:12 +00:00
Merge commit from fork
This commit is contained in:
+1
-1
@@ -687,7 +687,7 @@ func startAPIs(
|
|||||||
&config.SCIM,
|
&config.SCIM,
|
||||||
translator,
|
translator,
|
||||||
instanceInterceptor.HandlerFuncWithError,
|
instanceInterceptor.HandlerFuncWithError,
|
||||||
middleware.AuthorizationInterceptor(verifier, config.SystemAuthZ, config.InternalAuthZ).HandlerFuncWithError))
|
middleware.AuthorizationInterceptor(verifier, config.SystemAuthZ, config.InternalAuthZ).HandlerFuncWithError(schemas.HandlerPrefix)))
|
||||||
|
|
||||||
c, err := console.Start(config.Console, config.ExternalSecure, oidcServer.IssuerFromRequest, middleware.CallDurationHandler, instanceInterceptor.Handler, limitingAccessInterceptor, config.CustomerPortal)
|
c, err := console.Start(config.Console, config.ExternalSecure, oidcServer.IssuerFromRequest, middleware.CallDurationHandler, instanceInterceptor.Handler, limitingAccessInterceptor, config.CustomerPortal)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
|
|||||||
@@ -236,7 +236,7 @@ type {{.Name}} interface {
|
|||||||
|
|
||||||
func RegisterRoutes(router *mux.Router, s {{.Name}}) {
|
func RegisterRoutes(router *mux.Router, s {{.Name}}) {
|
||||||
|
|
||||||
router.Use(s.AuthInterceptor().Handler)
|
router.Use(s.AuthInterceptor().Handler(HandlerPrefix))
|
||||||
|
|
||||||
{{ range $service := .Services}}
|
{{ range $service := .Services}}
|
||||||
{{ range $method := .Methods}}
|
{{ range $method := .Methods}}
|
||||||
|
|||||||
@@ -3,7 +3,6 @@ package middleware
|
|||||||
import (
|
import (
|
||||||
"context"
|
"context"
|
||||||
"net/http"
|
"net/http"
|
||||||
"strings"
|
|
||||||
|
|
||||||
"github.com/gorilla/mux"
|
"github.com/gorilla/mux"
|
||||||
|
|
||||||
@@ -27,41 +26,47 @@ func AuthorizationInterceptor(verifier authz.APITokenVerifier, systemAuthConfig
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
func (a *AuthInterceptor) Handler(next http.Handler) http.Handler {
|
func (a *AuthInterceptor) Handler(routePrefix string) func(next http.Handler) http.Handler {
|
||||||
return a.HandlerFunc(next)
|
return func(next http.Handler) http.Handler {
|
||||||
}
|
return a.HandlerFunc(routePrefix)(next)
|
||||||
|
|
||||||
func (a *AuthInterceptor) HandlerFunc(next http.Handler) http.HandlerFunc {
|
|
||||||
return func(w http.ResponseWriter, r *http.Request) {
|
|
||||||
ctx, err := authorize(r, a.verifier, a.systemAuthConfig, a.authConfig)
|
|
||||||
if err != nil {
|
|
||||||
http.Error(w, err.Error(), http.StatusUnauthorized)
|
|
||||||
return
|
|
||||||
}
|
|
||||||
|
|
||||||
r = r.WithContext(ctx)
|
|
||||||
next.ServeHTTP(w, r)
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
func (a *AuthInterceptor) HandlerFuncWithError(next HandlerFuncWithError) HandlerFuncWithError {
|
func (a *AuthInterceptor) HandlerFunc(routePrefix string) func(http.Handler) http.HandlerFunc {
|
||||||
return func(w http.ResponseWriter, r *http.Request) error {
|
return func(next http.Handler) http.HandlerFunc {
|
||||||
ctx, err := authorize(r, a.verifier, a.systemAuthConfig, a.authConfig)
|
return func(w http.ResponseWriter, r *http.Request) {
|
||||||
if err != nil {
|
ctx, err := authorize(r, a.verifier, a.systemAuthConfig, a.authConfig, routePrefix)
|
||||||
return err
|
if err != nil {
|
||||||
}
|
http.Error(w, err.Error(), http.StatusUnauthorized)
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
r = r.WithContext(ctx)
|
r = r.WithContext(ctx)
|
||||||
return next(w, r)
|
next.ServeHTTP(w, r)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
func (a *AuthInterceptor) HandlerFuncWithError(routePrefix string) func(HandlerFuncWithError) HandlerFuncWithError {
|
||||||
|
return func(next HandlerFuncWithError) HandlerFuncWithError {
|
||||||
|
return func(w http.ResponseWriter, r *http.Request) error {
|
||||||
|
ctx, err := authorize(r, a.verifier, a.systemAuthConfig, a.authConfig, routePrefix)
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
|
||||||
|
r = r.WithContext(ctx)
|
||||||
|
return next(w, r)
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
type httpReq struct{}
|
type httpReq struct{}
|
||||||
|
|
||||||
func authorize(r *http.Request, verifier authz.APITokenVerifier, systemAuthConfig authz.Config, authConfig authz.Config) (_ context.Context, err error) {
|
func authorize(r *http.Request, verifier authz.APITokenVerifier, systemAuthConfig authz.Config, authConfig authz.Config, routePrefix string) (_ context.Context, err error) {
|
||||||
ctx := r.Context()
|
ctx := r.Context()
|
||||||
|
|
||||||
authOpt, needsToken := checkAuthMethod(r, verifier)
|
authOpt, needsToken := checkAuthMethod(r, verifier, routePrefix)
|
||||||
if !needsToken {
|
if !needsToken {
|
||||||
return ctx, nil
|
return ctx, nil
|
||||||
}
|
}
|
||||||
@@ -81,29 +86,21 @@ func authorize(r *http.Request, verifier authz.APITokenVerifier, systemAuthConfi
|
|||||||
return ctxSetter(ctx), nil
|
return ctxSetter(ctx), nil
|
||||||
}
|
}
|
||||||
|
|
||||||
func checkAuthMethod(r *http.Request, verifier authz.APITokenVerifier) (authz.Option, bool) {
|
func checkAuthMethod(r *http.Request, verifier authz.APITokenVerifier, routePrefix string) (authz.Option, bool) {
|
||||||
authOpt, needsToken := verifier.CheckAuthMethod(r.Method + ":" + r.RequestURI)
|
authOpt, needsToken := verifier.CheckAuthMethod(r.Method + ":" + r.RequestURI)
|
||||||
if needsToken {
|
if needsToken {
|
||||||
return authOpt, true
|
return authOpt, true
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// If the exact path doesn't match, try matching the path template (e.g. /users/{id} instead of /users/123).
|
||||||
|
// Since the path template is registered with the sub-router, we need to add the route prefix to it.
|
||||||
route := mux.CurrentRoute(r)
|
route := mux.CurrentRoute(r)
|
||||||
if route == nil {
|
if route == nil {
|
||||||
return authOpt, false
|
return authOpt, false
|
||||||
}
|
}
|
||||||
|
|
||||||
pathTemplate, err := route.GetPathTemplate()
|
pathTemplate, err := route.GetPathTemplate()
|
||||||
if err != nil || pathTemplate == "" {
|
if err != nil || pathTemplate == "" {
|
||||||
return authOpt, false
|
return authOpt, false
|
||||||
}
|
}
|
||||||
|
return verifier.CheckAuthMethod(r.Method + ":" + routePrefix + pathTemplate)
|
||||||
// the path prefix is usually handled in a router in upper layer
|
|
||||||
// trim the query and the path of the url to get the correct path prefix
|
|
||||||
pathPrefix := r.RequestURI
|
|
||||||
if i := strings.Index(pathPrefix, "?"); i != -1 {
|
|
||||||
pathPrefix = pathPrefix[0:i]
|
|
||||||
}
|
|
||||||
pathPrefix = strings.TrimSuffix(pathPrefix, r.URL.Path)
|
|
||||||
|
|
||||||
return verifier.CheckAuthMethod(r.Method + ":" + pathPrefix + pathTemplate)
|
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user