github.com/ngocphuongnb/tetua@v0.0.7-alpha/app/auth/auth.go (about)

     1  package auth
     2  
     3  import (
     4  	"net/http"
     5  	"time"
     6  
     7  	"github.com/ngocphuongnb/tetua/app/config"
     8  	"github.com/ngocphuongnb/tetua/app/entities"
     9  	"github.com/ngocphuongnb/tetua/app/repositories"
    10  	"github.com/ngocphuongnb/tetua/app/server"
    11  )
    12  
    13  var ActionConfigs = []*server.AuthConfig{}
    14  var ROLE_ADMIN = &entities.Role{
    15  	ID:   1,
    16  	Name: "Admin",
    17  	Root: true,
    18  }
    19  
    20  var ROLE_USER = &entities.Role{
    21  	ID:   2,
    22  	Name: "User",
    23  	Root: false,
    24  }
    25  
    26  var ROLE_GUEST = &entities.Role{
    27  	ID:   3,
    28  	Name: "Guest",
    29  	Root: false,
    30  }
    31  
    32  var GUEST_USER = &entities.User{
    33  	ID:       0,
    34  	Username: "Guest",
    35  	Roles:    []*entities.Role{ROLE_GUEST},
    36  }
    37  
    38  func Config(cfg *server.AuthConfig) *server.AuthConfig {
    39  	for _, ActionConfig := range ActionConfigs {
    40  		if ActionConfig.Action == cfg.Action {
    41  			panic("Duplicate action config: " + ActionConfig.Action)
    42  		}
    43  	}
    44  
    45  	ActionConfigs = append(ActionConfigs, cfg)
    46  
    47  	return cfg
    48  }
    49  
    50  func GetAuthConfig(action string) *server.AuthConfig {
    51  	for _, config := range ActionConfigs {
    52  		if config.Action == action {
    53  			return config
    54  		}
    55  	}
    56  
    57  	return nil
    58  }
    59  
    60  func SetLoginInfo(c server.Context, user *entities.User) error {
    61  	exp := time.Now().Add(time.Hour * 100 * 365 * 24)
    62  	jwtHeader, _ := c.Locals("jwt_header").(map[string]interface{})
    63  	jwtToken, err := user.JwtClaim(exp, jwtHeader)
    64  
    65  	if err != nil {
    66  		return err
    67  	}
    68  
    69  	c.Cookie(&server.Cookie{
    70  		Name:     config.APP_TOKEN_KEY,
    71  		Value:    jwtToken,
    72  		Expires:  exp,
    73  		HTTPOnly: false,
    74  		SameSite: "lax",
    75  		Secure:   true,
    76  	})
    77  
    78  	return nil
    79  }
    80  
    81  func Routes(s server.Server) {
    82  	authRoute := s.Group("/auth/:provider", func(c server.Context) error {
    83  		provider := c.Param("provider")
    84  
    85  		if GetProvider(provider) == nil {
    86  			c.Status(http.StatusNotFound)
    87  			return c.SendString("Invalid provider")
    88  		}
    89  
    90  		return c.Next()
    91  	})
    92  
    93  	authRoute.Get("", func(c server.Context) error {
    94  		provider := GetProvider(c.Param("provider"))
    95  		return provider.Login(c)
    96  	})
    97  
    98  	authRoute.Get("/callback", func(c server.Context) error {
    99  		provider := GetProvider(c.Param("provider"))
   100  		userData, err := provider.Callback(c)
   101  
   102  		if err != nil {
   103  			c.Logger().Error(err)
   104  			return c.Status(http.StatusBadGateway).SendString("Something went wrong")
   105  		}
   106  
   107  		user, err := repositories.User.CreateIfNotExistsByProvider(c.Context(), userData)
   108  
   109  		if err != nil {
   110  			c.Logger().Error(err)
   111  			return c.Status(http.StatusBadGateway).SendString("Something went wrong")
   112  		}
   113  
   114  		if err = SetLoginInfo(c, user); err != nil {
   115  			c.Logger().Error("Error setting login info", err)
   116  			return c.Status(http.StatusBadGateway).SendString("Something went wrong")
   117  		}
   118  
   119  		return c.Redirect("/")
   120  	})
   121  }