added oauth flow to get authorization code

This commit is contained in:
2026-01-22 19:52:43 +11:00
parent 414a417d63
commit 1667423db6
15 changed files with 1313 additions and 32 deletions

View File

@@ -0,0 +1,61 @@
package handlers
import (
"net/http"
"git.haelnorr.com/h/golib/hws"
"git.haelnorr.com/h/oslstats/internal/config"
"git.haelnorr.com/h/oslstats/pkg/oauth"
"github.com/pkg/errors"
)
func Callback(server *hws.Server, cfg *config.Config) http.Handler {
return http.HandlerFunc(
func(w http.ResponseWriter, r *http.Request) {
state := r.URL.Query().Get("state")
code := r.URL.Query().Get("code")
if state == "" && code == "" {
http.Redirect(w, r, "/", http.StatusBadRequest)
return
}
data, err := verifyState(cfg.OAuth, w, r, state)
if err != nil {
err = server.ThrowError(w, r, hws.HWSError{
StatusCode: http.StatusForbidden,
Message: "OAuth state verification failed",
Error: err,
Level: hws.ErrorLevel("debug"),
RenderErrorPage: true,
})
if err != nil {
server.ThrowFatal(w, err)
}
return
}
switch data {
case "login":
w.Write([]byte(code))
return
}
},
)
}
func verifyState(cfg *oauth.Config, w http.ResponseWriter, r *http.Request, state string) (string, error) {
if r == nil {
return "", errors.New("request cannot be nil")
}
if state == "" {
return "", errors.New("state param field is empty")
}
uak, err := oauth.GetStateCookie(r)
if err != nil {
return "", errors.Wrap(err, "oauth.GetStateCookie")
}
data, err := oauth.VerifyState(cfg, state, uak)
if err != nil {
return "", errors.Wrap(err, "oauth.VerifyState")
}
oauth.DeleteStateCookie(w)
return data, nil
}