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 }