Add logout button to /user
This commit is contained in:
parent
f9d12da7d3
commit
5c225c1f25
|
@ -18,7 +18,7 @@ func HandleLogout(sc context.ServerContext) echo.HandlerFunc {
|
||||||
)
|
)
|
||||||
if cookie, err = c.Cookie("session"); err != nil {
|
if cookie, err = c.Cookie("session"); err != nil {
|
||||||
// cookie not found
|
// cookie not found
|
||||||
return c.Redirect(http.StatusSeeOther, "/")
|
return c.JSON(http.StatusNotFound, map[string]string{"reason": "session not found"})
|
||||||
}
|
}
|
||||||
sessionId = cookie.Value
|
sessionId = cookie.Value
|
||||||
if err = sc.Db.DeleteSession(&db.Session{SessionId: sessionId}); err != nil {
|
if err = sc.Db.DeleteSession(&db.Session{SessionId: sessionId}); err != nil {
|
||||||
|
@ -26,6 +26,6 @@ func HandleLogout(sc context.ServerContext) echo.HandlerFunc {
|
||||||
}
|
}
|
||||||
// tell browser that cookie is expired and thus can be deleted
|
// tell browser that cookie is expired and thus can be deleted
|
||||||
c.SetCookie(&http.Cookie{Name: "session", HttpOnly: true, Path: "/", Value: sessionId, Secure: true, Expires: time.Now()})
|
c.SetCookie(&http.Cookie{Name: "session", HttpOnly: true, Path: "/", Value: sessionId, Secure: true, Expires: time.Now()})
|
||||||
return c.Redirect(http.StatusSeeOther, "/")
|
return c.JSON(http.StatusSeeOther, map[string]string{"status": "OK"})
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -25,7 +25,6 @@ func mountMiddleware(e *echo.Echo, sc ServerContext) {
|
||||||
|
|
||||||
func addFrontendRoutes(e *echo.Echo, sc ServerContext) {
|
func addFrontendRoutes(e *echo.Echo, sc ServerContext) {
|
||||||
GET(e, sc, "/", handler.HandleIndex)
|
GET(e, sc, "/", handler.HandleIndex)
|
||||||
POST(e, sc, "/logout", handler.HandleLogout)
|
|
||||||
GET(e, sc, "/user",
|
GET(e, sc, "/user",
|
||||||
handler.HandleUser,
|
handler.HandleUser,
|
||||||
middleware.SessionGuard)
|
middleware.SessionGuard)
|
||||||
|
@ -44,6 +43,7 @@ func addFrontendRoutes(e *echo.Echo, sc ServerContext) {
|
||||||
func addBackendRoutes(e *echo.Echo, sc ServerContext) {
|
func addBackendRoutes(e *echo.Echo, sc ServerContext) {
|
||||||
GET(e, sc, "/api/login", handler.HandleLogin)
|
GET(e, sc, "/api/login", handler.HandleLogin)
|
||||||
GET(e, sc, "/api/login/callback", handler.HandleLoginCallback)
|
GET(e, sc, "/api/login/callback", handler.HandleLoginCallback)
|
||||||
|
POST(e, sc, "/api/logout", handler.HandleLogout)
|
||||||
GET(e, sc, "/api/session", handler.HandleCheckSession)
|
GET(e, sc, "/api/session", handler.HandleCheckSession)
|
||||||
GET(e, sc, "/api/invoice/:id",
|
GET(e, sc, "/api/invoice/:id",
|
||||||
handler.HandleInvoiceStatus,
|
handler.HandleInvoiceStatus,
|
||||||
|
|
|
@ -1,8 +1,32 @@
|
||||||
<template>
|
<template>
|
||||||
<div v-if="session.pubkey">authenticated as {{ session.pubkey.slice(0,8) }}</div>
|
<div v-if="session.pubkey">
|
||||||
|
<div>authenticated as {{ session.pubkey.slice(0,8) }}</div>
|
||||||
|
<button class="my-1" @click="logout">logout</button>
|
||||||
|
</div>
|
||||||
</template>
|
</template>
|
||||||
|
|
||||||
<script setup>
|
<script setup>
|
||||||
import { useSession } from '@/stores/session'
|
import { useSession } from '@/stores/session'
|
||||||
|
import { useRouter } from 'vue-router'
|
||||||
const session = useSession()
|
const session = useSession()
|
||||||
|
const router = useRouter()
|
||||||
|
|
||||||
|
const logout = async () => {
|
||||||
|
await session.logout()
|
||||||
|
router.push('/')
|
||||||
|
}
|
||||||
|
|
||||||
</script>
|
</script>
|
||||||
|
|
||||||
|
<style scoped>
|
||||||
|
button {
|
||||||
|
color: #ffffff;
|
||||||
|
border: solid 1px #8787A4;
|
||||||
|
padding: 0 1em;
|
||||||
|
}
|
||||||
|
|
||||||
|
button:hover {
|
||||||
|
color: #ffffff;
|
||||||
|
background: #8787A4;
|
||||||
|
}
|
||||||
|
</style>
|
||||||
|
|
|
@ -37,5 +37,16 @@ export const useSession = defineStore('session', () => {
|
||||||
return fetch(url, { credentials: 'include' }).then(r => r.json())
|
return fetch(url, { credentials: 'include' }).then(r => r.json())
|
||||||
}
|
}
|
||||||
|
|
||||||
return { pubkey, isAuthenticated, initialized, init, checkSession, login }
|
function logout () {
|
||||||
|
const url = window.origin + '/api/logout'
|
||||||
|
return fetch(url, { method: 'POST', credentials: 'include' })
|
||||||
|
.then(async r => {
|
||||||
|
const body = await r.json()
|
||||||
|
if (body.status === 'OK') {
|
||||||
|
pubkey.value = null
|
||||||
|
}
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
|
return { pubkey, isAuthenticated, initialized, init, checkSession, login, logout }
|
||||||
})
|
})
|
||||||
|
|
Loading…
Reference in New Issue