This repository has been archived on 2023-08-20. You can view files and clone it, but cannot push or open issues or pull requests.
backend/internal/chi/middleware/authenticate.go

51 lines
1.1 KiB
Go

package middleware
import (
"context"
"github.com/pkg/errors"
"net/http"
"gitea.dwysokinski.me/zdam-egzamin-zawodowy/backend/internal/auth"
"gitea.dwysokinski.me/zdam-egzamin-zawodowy/backend/internal/model"
)
const (
authorizationHeader = "Authorization"
)
var (
authenticateKey contextKey = "current_user"
)
func Authenticate(ucase auth.Usecase) func(next http.Handler) http.Handler {
return func(next http.Handler) http.Handler {
return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
token := extractToken(r.Header.Get("Authorization"))
if token != "" {
ctx := r.Context()
user, err := ucase.ExtractAccessTokenMetadata(ctx, token)
if err == nil && user != nil {
ctx = context.WithValue(ctx, authenticateKey, user)
r = r.WithContext(ctx)
}
}
next.ServeHTTP(w, r)
})
}
}
func UserFromContext(ctx context.Context) (*model.User, error) {
user := ctx.Value(authenticateKey)
if user == nil {
err := errors.New("couldn't retrieve *model.User")
return nil, err
}
u, ok := user.(*model.User)
if !ok {
err := errors.New("*model.User has wrong type")
return nil, err
}
return u, nil
}