mediahls/internal/handlers/middleware.go
2023-11-29 09:46:09 +00:00

66 lines
1.4 KiB
Go

package handlers
import (
"context"
"encoding/json"
"log"
"net/http"
"github.com/zhang2092/mediahls/internal/pkg/convert"
)
func (server *Server) authorizeMiddleware(next http.Handler) http.Handler {
return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
u, err := server.withCookie(r)
if err != nil {
http.Redirect(w, r, "/login", http.StatusFound)
return
}
b, err := json.Marshal(u)
if err != nil {
log.Printf("json marshal authorize user: %v", err)
http.Redirect(w, r, "/login", http.StatusFound)
return
}
ctx := r.Context()
ctx = context.WithValue(ctx, ContextUser, b)
next.ServeHTTP(w, r.WithContext(ctx))
})
}
func (server *Server) withCookie(r *http.Request) (*authorize, error) {
cookie, err := r.Cookie(AuthorizeCookie)
if err != nil {
log.Printf("get cookie: %v", err)
return nil, err
}
u := &authorize{}
err = server.secureCookie.Decode(AuthorizeCookie, cookie.Value, u)
if err != nil {
log.Printf("secure decode cookie: %v", err)
return nil, err
}
return u, nil
}
func withUser(ctx context.Context) *authorize {
var result authorize
ctxValue, err := convert.ToByteE(ctx.Value(ContextUser))
log.Printf("ctx: %s", ctxValue)
if err != nil {
log.Printf("1: %v", err)
return nil
}
err = json.Unmarshal(ctxValue, &result)
if err != nil {
log.Printf("2: %v", err)
return nil
}
return &result
}