Merge pull request #641 from james-d-elliott/fix-authelia-headers

fix(authelia): original headers
This commit is contained in:
Toby Chui 2025-04-21 18:56:28 +08:00 committed by GitHub
commit 36c2c9a00e
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
2 changed files with 51 additions and 13 deletions

View File

@ -195,6 +195,16 @@ Loopback web SSH connections, by default, are disabled. This means that if you a
./zoraxy -sshlb=true ./zoraxy -sshlb=true
``` ```
## Community Maintained Sections
Some section of Zoraxy are contributed by our amazing community and if you have any issues regarding those sections, it would be more efficient if you can tag them directly when creating an issue report.
- Authelia Support added by [@7brend7](https://github.com/7brend7)
- Authentik Support added by [@JokerQyou](https://github.com/JokerQyou)
- Docker Container List by [@eyerrock](https://github.com/eyerrock)
Thank you so much for your contributions!
## Sponsor This Project ## Sponsor This Project
If you like the project and want to support us, please consider a donation. You can use the links below If you like the project and want to support us, please consider a donation. You can use the links below

View File

@ -3,9 +3,10 @@ package authelia
import ( import (
"encoding/json" "encoding/json"
"errors" "errors"
"fmt" "net"
"net/http" "net/http"
"net/url" "net/url"
"strings"
"imuslab.com/zoraxy/mod/database" "imuslab.com/zoraxy/mod/database"
"imuslab.com/zoraxy/mod/info/logger" "imuslab.com/zoraxy/mod/info/logger"
@ -93,25 +94,20 @@ func (ar *AutheliaRouter) HandleAutheliaAuth(w http.ResponseWriter, r *http.Requ
protocol = "https" protocol = "https"
} }
autheliaBaseURL := protocol + "://" + ar.options.AutheliaURL autheliaURL := &url.URL{
//Remove tailing slash if any Scheme: protocol,
if autheliaBaseURL[len(autheliaBaseURL)-1] == '/' { Host: ar.options.AutheliaURL,
autheliaBaseURL = autheliaBaseURL[:len(autheliaBaseURL)-1]
} }
//Make a request to Authelia to verify the request //Make a request to Authelia to verify the request
req, err := http.NewRequest("POST", autheliaBaseURL+"/api/verify", nil) req, err := http.NewRequest("POST", autheliaURL.JoinPath("api", "verify").String(), nil)
if err != nil { if err != nil {
ar.options.Logger.PrintAndLog("Authelia", "Unable to create request", err) ar.options.Logger.PrintAndLog("Authelia", "Unable to create request", err)
w.WriteHeader(401) w.WriteHeader(401)
return errors.New("unauthorized") return errors.New("unauthorized")
} }
scheme := "http" originalURL := rOriginalHeaders(r, req)
if r.TLS != nil {
scheme = "https"
}
req.Header.Add("X-Original-URL", fmt.Sprintf("%s://%s", scheme, r.Host))
// Copy cookies from the incoming request // Copy cookies from the incoming request
for _, cookie := range r.Cookies() { for _, cookie := range r.Cookies() {
@ -127,10 +123,42 @@ func (ar *AutheliaRouter) HandleAutheliaAuth(w http.ResponseWriter, r *http.Requ
} }
if resp.StatusCode != 200 { if resp.StatusCode != 200 {
redirectURL := autheliaBaseURL + "/?rd=" + url.QueryEscape(scheme+"://"+r.Host+r.URL.String()) + "&rm=" + r.Method redirectURL := autheliaURL.JoinPath()
http.Redirect(w, r, redirectURL, http.StatusSeeOther)
query := redirectURL.Query()
query.Set("rd", originalURL.String())
query.Set("rm", r.Method)
http.Redirect(w, r, redirectURL.String(), http.StatusSeeOther)
return errors.New("unauthorized") return errors.New("unauthorized")
} }
return nil return nil
} }
func rOriginalHeaders(r, req *http.Request) *url.URL {
if r.RemoteAddr != "" {
before, _, _ := strings.Cut(r.RemoteAddr, ":")
if ip := net.ParseIP(before); ip != nil {
req.Header.Set("X-Forwarded-For", ip.String())
}
}
originalURL := &url.URL{
Scheme: "http",
Host: r.Host,
Path: r.URL.Path,
RawPath: r.URL.RawPath,
}
if r.TLS != nil {
originalURL.Scheme = "https"
}
req.Header.Add("X-Forwarded-Method", r.Method)
req.Header.Add("X-Original-URL", originalURL.String())
return originalURL
}