finalize sse login

* redirect and save the cookie
* supress a warning and redirect immediatly
This commit is contained in:
Henry 2021-03-25 15:17:30 +01:00
parent 4325e0fb3d
commit 428ffb0bda
3 changed files with 40 additions and 13 deletions

View File

@ -9,6 +9,7 @@ evtSource.onerror = (e) => {
failed.textContent = "Warning: The connection to the server was interupted."
}
// TODO: change to some css-style progress indicator
evtSource.addEventListener("ping", (e) => {
ping.textContent = e.data;
})
@ -18,6 +19,6 @@ evtSource.addEventListener("failed", (e) => {
})
evtSource.addEventListener("success", (e) => {
console.log('trigger redirect!')
alert(e.data)
evtSource.close()
window.location = `/sse/finalize?token=${e.data}`
})

View File

@ -75,6 +75,7 @@ func NewWithSSBHandler(
m.HandleFunc("/sse/login", r.HTML("auth/withssb_server_start.tmpl", ssb.startWithServer))
m.HandleFunc("/sse/events", ssb.eventSource)
m.HandleFunc("/sse/finalize", ssb.finalizeCookie)
return &ssb
}
@ -154,22 +155,31 @@ func (h WithSSBHandler) login(w http.ResponseWriter, req *http.Request) (interfa
return nil, err
}
session, err := h.cookieStore.Get(req, siwssbSessionName)
if err != nil {
err = fmt.Errorf("sign-in with ssb: failed to load cookie session: %w", err)
return nil, err
}
session.Values[memberToken] = tok
session.Values[userTimeout] = time.Now().Add(lifetime)
if err := session.Save(req, w); err != nil {
err = fmt.Errorf("sign-in with ssb: failed to update cookie session: %w", err)
if err := h.saveCookie(w, req, tok); err != nil {
return nil, err
}
return "you are now logged in!", nil
}
func (h WithSSBHandler) saveCookie(w http.ResponseWriter, req *http.Request, token string) error {
session, err := h.cookieStore.Get(req, siwssbSessionName)
if err != nil {
err = fmt.Errorf("sign-in with ssb: failed to load cookie session: %w", err)
return err
}
session.Values[memberToken] = token
session.Values[userTimeout] = time.Now().Add(lifetime)
if err := session.Save(req, w); err != nil {
err = fmt.Errorf("sign-in with ssb: failed to update cookie session: %w", err)
return err
}
return nil
}
// custom sessionKey type to prevent collision
type sessionKey uint
@ -396,6 +406,7 @@ func (h WithSSBHandler) eventSource(w http.ResponseWriter, r *http.Request) {
sendServerEvent(w, evt)
logger.Log("event", "sent", "worked", update.Worked)
return
}
evtID++
flusher.Flush()
@ -410,3 +421,18 @@ func sendServerEvent(w io.Writer, evt event) {
}
fmt.Fprint(w, "\n")
}
func (h WithSSBHandler) finalizeCookie(w http.ResponseWriter, r *http.Request) {
tok := r.URL.Query().Get("token")
if _, err := h.sessiondb.CheckToken(r.Context(), tok); err != nil {
http.Error(w, "invalid session token", http.StatusInternalServerError)
return
}
if err := h.saveCookie(w, r, tok); err != nil {
http.Error(w, "failed to save cookie", http.StatusInternalServerError)
return
}
http.Redirect(w, r, "/", http.StatusTemporaryRedirect)
}

View File

@ -5,7 +5,7 @@
</div>
<div>
<img src="{{.QRCodeURI}}" alt="QR-Code to pass the challenge to an App" />
<a href="{{.SSBURI}}">{{i18n "GenericOpenLink"}}</a>
<a href="{{.SSBURI}}" target="_blank">{{i18n "GenericOpenLink"}}</a>
<h3>Server events</h3>
<p id="ping"></p>