github.com/benoitkugler/goacve@v0.0.0-20201217100549-151ce6e55dc8/server/directeurs/token.go (about)

     1  package directeurs
     2  
     3  import (
     4  	"errors"
     5  	"fmt"
     6  	"strconv"
     7  	"time"
     8  
     9  	"github.com/benoitkugler/goACVE/server/shared"
    10  )
    11  
    12  type tokenData struct {
    13  	Time   time.Time
    14  	IdCamp int64
    15  }
    16  
    17  func (ct Controller) creeToken(idCamp int64) (string, error) {
    18  	t := tokenData{
    19  		Time:   time.Now(),
    20  		IdCamp: idCamp,
    21  	}
    22  	return shared.Encode(ct.Signing, t)
    23  }
    24  
    25  func (ct Controller) refreshToken(token string, idCamp int64) (newToken string, err error) {
    26  	var data tokenData
    27  	if err = shared.Decode(ct.Signing, token, &data); err != nil {
    28  		return "", err
    29  	}
    30  	if idCamp != data.IdCamp {
    31  		return "", errors.New("Token corrompu : camp invalide.")
    32  	}
    33  	diff := time.Since(data.Time)
    34  	if diff > DeltaToken {
    35  		diff = diff.Truncate(time.Second)
    36  		return "", fmt.Errorf("Session écoulée (dernière action il y a %s). Veuillez vous reconnecter.", diff)
    37  	}
    38  	return ct.creeToken(idCamp)
    39  }
    40  
    41  func (ct Controller) ShowTokenDev() (string, error) {
    42  	var idCamp int64 = 59
    43  	t, err := ct.creeToken(idCamp)
    44  	if err != nil {
    45  		return "", err
    46  	}
    47  	return fmt.Sprintf("Camp : %d - token : %s \n", idCamp, t), nil
    48  }
    49  
    50  type withBasicAuth interface {
    51  	BasicAuth() (username, password string, ok bool)
    52  }
    53  
    54  // authentifie vérifie le token et le met à jour,
    55  // et renvoie l'id du camp associé
    56  func (ct Controller) authentifie(req withBasicAuth) (int64, string, error) {
    57  	username, token, ok := req.BasicAuth()
    58  	if !ok {
    59  		return 0, "", errors.New("Champ d'authentification manquantes !")
    60  	}
    61  	idCamp, err := strconv.ParseInt(username, 10, 0)
    62  	if err != nil {
    63  		return 0, "", shared.FormatErr("Identifiant du camp invalide", err)
    64  	}
    65  	token, err = ct.refreshToken(token, idCamp)
    66  	if err != nil {
    67  		return 0, "", err
    68  	}
    69  	return idCamp, token, nil
    70  }