aboutsummaryrefslogtreecommitdiff
path: root/backend/controllers/loginController.go
diff options
context:
space:
mode:
Diffstat (limited to 'backend/controllers/loginController.go')
-rw-r--r--backend/controllers/loginController.go170
1 files changed, 0 insertions, 170 deletions
diff --git a/backend/controllers/loginController.go b/backend/controllers/loginController.go
deleted file mode 100644
index 9d772a5..0000000
--- a/backend/controllers/loginController.go
+++ /dev/null
@@ -1,170 +0,0 @@
1package controllers
2
3import (
4 "encoding/json"
5 "fmt"
6 "io/ioutil"
7 "net/http"
8 "os"
9 "time"
10
11 "github.com/gin-gonic/gin"
12 "github.com/golang-jwt/jwt/v4"
13 "github.com/pektezol/leastportalshub/backend/database"
14 "github.com/pektezol/leastportalshub/backend/models"
15 "github.com/solovev/steam_go"
16)
17
18type LoginResponse struct {
19 Token string `json:"token"`
20}
21
22// Login
23//
24// @Description Get (redirect) login page for Steam auth.
25// @Tags login
26// @Accept json
27// @Produce json
28// @Success 200 {object} models.Response{data=LoginResponse}
29// @Failure 400 {object} models.Response
30// @Router /login [get]
31func Login(c *gin.Context) {
32 openID := steam_go.NewOpenId(c.Request)
33 switch openID.Mode() {
34 case "":
35 c.Redirect(http.StatusMovedPermanently, openID.AuthUrl())
36 case "cancel":
37 c.Redirect(http.StatusMovedPermanently, "/")
38 default:
39 steamID, err := openID.ValidateAndGetId()
40 if err != nil {
41 c.JSON(http.StatusBadRequest, models.ErrorResponse(err.Error()))
42 return
43 }
44 // Create user if new
45 var checkSteamID int64
46 err = database.DB.QueryRow("SELECT steam_id FROM users WHERE steam_id = $1", steamID).Scan(&checkSteamID)
47 // if err != nil {
48 // c.JSON(http.StatusBadRequest, models.ErrorResponse(err.Error()))
49 // return
50 // }
51 // User does not exist
52 if checkSteamID == 0 {
53 user, err := GetPlayerSummaries(steamID, os.Getenv("API_KEY"))
54 if err != nil {
55 c.JSON(http.StatusBadRequest, models.ErrorResponse(err.Error()))
56 return
57 }
58 // Empty country code check
59 if user.LocCountryCode == "" {
60 user.LocCountryCode = "XX"
61 }
62 // Insert new user to database
63 database.DB.Exec(`INSERT INTO users (steam_id, user_name, avatar_link, country_code)
64 VALUES ($1, $2, $3, $4)`, steamID, user.PersonaName, user.AvatarFull, user.LocCountryCode)
65 }
66 moderator := false
67 rows, _ := database.DB.Query("SELECT title_name FROM titles t INNER JOIN user_titles ut ON t.id=ut.title_id WHERE ut.user_id = $1", steamID)
68 for rows.Next() {
69 var title string
70 rows.Scan(&title)
71 if title == "Moderator" {
72 moderator = true
73 }
74 }
75 // Generate JWT token
76 token := jwt.NewWithClaims(jwt.SigningMethodHS256, jwt.MapClaims{
77 "sub": steamID,
78 "exp": time.Now().Add(time.Hour * 24 * 30).Unix(),
79 "mod": moderator,
80 })
81 // Sign and get the complete encoded token as a string using the secret
82 tokenString, err := token.SignedString([]byte(os.Getenv("SECRET_KEY")))
83 if err != nil {
84 c.JSON(http.StatusBadRequest, models.ErrorResponse("Failed to generate token."))
85 return
86 }
87 c.SetCookie("token", tokenString, 3600*24*30, "/", "", true, true)
88 c.Redirect(http.StatusTemporaryRedirect, "/")
89 // c.JSON(http.StatusOK, models.Response{
90 // Success: true,
91 // Message: "Successfully generated token.",
92 // Data: LoginResponse{
93 // Token: tokenString,
94 // },
95 // })
96 return
97 }
98}
99
100// GET Token
101//
102// @Description Gets the token cookie value from the user.
103// @Tags auth
104// @Produce json
105//
106// @Success 200 {object} models.Response{data=LoginResponse}
107// @Failure 404 {object} models.Response
108// @Router /token [get]
109func GetCookie(c *gin.Context) {
110 cookie, err := c.Cookie("token")
111 if err != nil {
112 c.JSON(http.StatusNotFound, models.ErrorResponse("No token cookie found."))
113 return
114 }
115 c.JSON(http.StatusOK, models.Response{
116 Success: true,
117 Message: "Token cookie successfully retrieved.",
118 Data: LoginResponse{
119 Token: cookie,
120 },
121 })
122}
123
124// DELETE Token
125//
126// @Description Deletes the token cookie from the user.
127// @Tags auth
128// @Produce json
129//
130// @Success 200 {object} models.Response{data=LoginResponse}
131// @Failure 404 {object} models.Response
132// @Router /token [delete]
133func DeleteCookie(c *gin.Context) {
134 cookie, err := c.Cookie("token")
135 if err != nil {
136 c.JSON(http.StatusNotFound, models.ErrorResponse("No token cookie found."))
137 return
138 }
139 c.SetCookie("token", "", -1, "/", "", true, true)
140 c.JSON(http.StatusOK, models.Response{
141 Success: true,
142 Message: "Token cookie successfully deleted.",
143 Data: LoginResponse{
144 Token: cookie,
145 },
146 })
147}
148
149func GetPlayerSummaries(steamId, apiKey string) (*models.PlayerSummaries, error) {
150 url := fmt.Sprintf("http://api.steampowered.com/ISteamUser/GetPlayerSummaries/v2/?key=%s&steamids=%s", apiKey, steamId)
151 resp, err := http.Get(url)
152 if err != nil {
153 return nil, err
154 }
155 body, err := ioutil.ReadAll(resp.Body)
156 if err != nil {
157 return nil, err
158 }
159
160 type Result struct {
161 Response struct {
162 Players []models.PlayerSummaries `json:"players"`
163 } `json:"response"`
164 }
165 var data Result
166 if err := json.Unmarshal(body, &data); err != nil {
167 return nil, err
168 }
169 return &data.Response.Players[0], err
170}