Added a log out feature.

This commit is contained in:
Ada Werefox 2025-04-22 17:04:17 -07:00
parent dc55b6f19a
commit d20eff4306
4 changed files with 54 additions and 13 deletions

View file

@ -114,6 +114,17 @@ func loginRedirect(context *gin.Context) {
context.Redirect(302, oauthConfig.AuthCodeURL(context.GetString("state")))
}
func logoutRedirect(context *gin.Context) {
oauthTokenJSON, err := context.Cookie("discord-oauthtoken")
if err == nil {
dbcommands.LogoutDatabaseUser(db, oauthTokenJSON)
context.SetCookie("discord-oauthtoken", "", -1, "", config.API.Domain, false, true)
} else {
log.Println(err)
}
context.Redirect(http.StatusTemporaryRedirect, "/")
}
func authCallback(context *gin.Context) {
oauthState := randomstring.CookieFriendlyString(32)
context.Set("state", oauthState)
@ -127,6 +138,8 @@ func authCallback(context *gin.Context) {
}
oauthTokenJSON, _ := json.Marshal(oauthToken)
context.SetCookie("discord-oauthtoken", string(oauthTokenJSON), 0, "", config.API.Domain, false, false)
user := getDiscordUser(context, oauthToken)
createOrUpdateUser(context, oauthToken, user)
context.Redirect(http.StatusTemporaryRedirect, "/dashboard")
}
@ -155,8 +168,7 @@ func getDiscordUser(context *gin.Context, oauthToken *oauth2.Token) discordUser
return user
}
func createOrUpdateUser(context *gin.Context, oauthToken *oauth2.Token) {
user := getDiscordUser(context, oauthToken)
func createOrUpdateUser(context *gin.Context, oauthToken *oauth2.Token, user discordUser) {
oauthTokenJSON, err := json.Marshal(oauthToken)
if err != nil {
log.Println(err)
@ -168,16 +180,18 @@ func createOrUpdateUser(context *gin.Context, oauthToken *oauth2.Token) {
Avatar: user.Avatar,
AvatarDecoration: user.Avatar_Decoration_Data.Asset,
LoginToken: string(oauthTokenJSON),
LoggedIn: true,
}
if dbcommands.DatabaseUserExists(db, user.Id) {
dbOAuthToken := dbcommands.GetDatabaseUserToken(db, user.Id)
if dbOAuthToken == "" {
context.SetCookie("discord-oauthtoken", string(oauthTokenJSON), 0, "", config.API.Domain, false, false)
err := dbcommands.UpdateDatabaseUser(db, dbUser)
if err != nil {
log.Println(err)
}
} else {
context.SetCookie("discord-oauthtoken", dbOAuthToken, 0, "", config.API.Domain, false, false)
dbUser.LoginToken = dbOAuthToken
}
err := dbcommands.UpdateDatabaseUser(db, dbUser)
if err != nil {
log.Println(err)
}
} else {
err := dbcommands.CreateDatabaseUser(db, dbUser)
@ -194,9 +208,12 @@ func dashboardDisplay(context *gin.Context) {
err := json.Unmarshal([]byte(oauthTokenJSON), &oauthToken)
if err == nil {
if oauthToken.Valid() {
createOrUpdateUser(context, oauthToken)
user := getDiscordUser(context, oauthToken)
context.HTML(http.StatusOK, "dashboard.html", user)
if dbcommands.DatabaseUserLoggedIn(db, user.Id) {
context.HTML(http.StatusOK, "dashboard.html", user)
} else {
context.Redirect(http.StatusTemporaryRedirect, "/logout")
}
return
}
} else {
@ -218,6 +235,7 @@ func main() {
app.GET("/", loginDisplay)
app.GET("/login", loginRedirect)
app.GET("/auth/callback", authCallback)
app.GET("/logout", logoutRedirect)
app.GET("/dashboard", dashboardDisplay)
app.Run(":31337")
}

View file

@ -16,6 +16,7 @@ type User struct {
Avatar string
AvatarDecoration string
LoginToken string
LoggedIn bool
}
func InitializeDatabase() *gorm.DB {
@ -47,6 +48,16 @@ func DatabaseUserExists(db *gorm.DB, id string) bool {
}
}
func DatabaseUserLoggedIn(db *gorm.DB, id string) bool {
var queryUser User
result := db.Where("id = ?", id).Take(&queryUser)
if errors.Is(result.Error, gorm.ErrRecordNotFound) {
return false
} else {
return queryUser.LoggedIn
}
}
func UpdateDatabaseUser(db *gorm.DB, user User) error {
result := db.Save(&user)
if result.Error != nil {
@ -62,3 +73,8 @@ func CreateDatabaseUser(db *gorm.DB, user User) error {
}
return nil
}
func LogoutDatabaseUser(db *gorm.DB, oauthToken string) {
db.Model(&User{}).Where("login_token = ?", oauthToken).Update("logged_in", false)
db.Model(&User{}).Where("login_token = ?", oauthToken).Update("login_token", "")
}

View file

@ -6,8 +6,7 @@ require (
github.com/jinzhu/inflection v1.0.0 // indirect
github.com/jinzhu/now v1.1.5 // indirect
github.com/mattn/go-sqlite3 v1.14.22 // indirect
golang.org/x/oauth2 v0.29.0 // indirect
golang.org/x/text v0.14.0 // indirect
gorm.io/driver/sqlite v1.5.7 // indirect
gorm.io/gorm v1.25.12 // indirect
gorm.io/driver/sqlite v1.5.7 // direct
gorm.io/gorm v1.25.12 // direct
)

View file

@ -16,7 +16,8 @@
class="container max-w-3xl p-4 mx-auto space-y-2 font-mono text-white bg-primary min-w-xs md:space-y-4">
<div class="p-2 bg-secondary md:p-4 ring-2 ring-secondary/80">
<div class="bg-primary ring-2 ring-primary/80">
<div class="flex flex-col w-full h-full p-2 space-x-4 rounded-sm space-2 drop-shadow-md drop-shadow-accent">
<div
class="flex flex-col w-full h-full p-2 space-x-4 rounded-sm space-2 drop-shadow-md drop-shadow-accent">
<h1 class="text-md md:text-xl">> USER AUTHENTICATED</h1>
</div>
</div>
@ -24,9 +25,16 @@
<div class="p-2 bg-secondary md:p-4 ring-2 ring-secondary/80">
{{ template "userinfo.html" . }}
</div>
<a class="flex w-full p-2 font-mono text-lg md:p-4 md:text-2xl bg-secondary ring-2 ring-secondary/80 h-fit0 hover:bg-secondary/50"
href="logout">
<div class="w-full h-full text-center bg-primary">
<p class="drop-shadow-accent drop-shadow-md">Logout</p>
</div>
</a>
</div>
</div>
</div>
</div>
</body>
</html>