aboutsummaryrefslogtreecommitdiff
path: root/backend/handlers/login.go
diff options
context:
space:
mode:
authorNidboj132 <lol2s@vp.plm>2023-09-05 18:23:11 +0200
committerNidboj132 <lol2s@vp.plm>2023-09-05 18:23:11 +0200
commit3869cb67351ccf3bc45b076f31afdc7133292c39 (patch)
treedc03341e147dde0964bf6be84b14e13424c647b7 /backend/handlers/login.go
parentadded graph and fixed some css (diff)
parentfix: create map summary, why the fuck does this have to be a pointer integer?? (diff)
downloadlphub-3869cb67351ccf3bc45b076f31afdc7133292c39.tar.gz
lphub-3869cb67351ccf3bc45b076f31afdc7133292c39.tar.bz2
lphub-3869cb67351ccf3bc45b076f31afdc7133292c39.zip
Merge branch 'main' of https://github.com/pektezol/LeastPortalsHub
Former-commit-id: 221385f463b7f5b0fc43a093b2c7c46e68d46d68
Diffstat (limited to 'backend/handlers/login.go')
-rw-r--r--backend/handlers/login.go170
1 files changed, 170 insertions, 0 deletions
diff --git a/backend/handlers/login.go b/backend/handlers/login.go
new file mode 100644
index 0000000..85ffd63
--- /dev/null
+++ b/backend/handlers/login.go
@@ -0,0 +1,170 @@
1package handlers
2
3import (
4 "encoding/json"
5 "fmt"
6 "io"
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 CreateLog(steamID, LogTypeUser, LogDescriptionUserLoginFailValidate)
42 c.JSON(http.StatusBadRequest, models.ErrorResponse(err.Error()))
43 return
44 }
45 // Create user if new
46 var checkSteamID int64
47 database.DB.QueryRow("SELECT steam_id FROM users WHERE steam_id = $1", steamID).Scan(&checkSteamID)
48 // User does not exist
49 if checkSteamID == 0 {
50 user, err := GetPlayerSummaries(steamID, os.Getenv("API_KEY"))
51 if err != nil {
52 CreateLog(steamID, LogTypeUser, LogDescriptionUserLoginFailSummary)
53 c.JSON(http.StatusBadRequest, models.ErrorResponse(err.Error()))
54 return
55 }
56 // Empty country code check
57 if user.LocCountryCode == "" {
58 user.LocCountryCode = "XX"
59 }
60 // Insert new user to database
61 database.DB.Exec(`INSERT INTO users (steam_id, user_name, avatar_link, country_code)
62 VALUES ($1, $2, $3, $4)`, steamID, user.PersonaName, user.AvatarFull, user.LocCountryCode)
63 }
64 moderator := false
65 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)
66 for rows.Next() {
67 var title string
68 rows.Scan(&title)
69 if title == "Moderator" {
70 moderator = true
71 }
72 }
73 // Generate JWT token
74 token := jwt.NewWithClaims(jwt.SigningMethodHS256, jwt.MapClaims{
75 "sub": steamID,
76 "exp": time.Now().Add(time.Hour * 24 * 30).Unix(),
77 "mod": moderator,
78 })
79 // Sign and get the complete encoded token as a string using the secret
80 tokenString, err := token.SignedString([]byte(os.Getenv("SECRET_KEY")))
81 if err != nil {
82 CreateLog(steamID, LogTypeUser, LogDescriptionUserLoginFailToken)
83 c.JSON(http.StatusBadRequest, models.ErrorResponse("Failed to generate token."))
84 return
85 }
86 c.SetCookie("token", tokenString, 3600*24*30, "/", "", true, true)
87 CreateLog(steamID, LogTypeUser, LogDescriptionUserLoginSuccess)
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 := io.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}