feat: add HTTP-only cookie for browser authentication
- Set HTTP-only cookie in login handler for SSR authentication - Set HTTP-only cookie in registration handler - Change default redirect from /bookshelf to /dashboard - Cookie enables browser page navigation without JavaScript
This commit is contained in:
@@ -213,6 +213,17 @@ func (h *AuthHandler) Register(c echo.Context) error {
|
|||||||
return c.JSON(http.StatusInternalServerError, map[string]string{"error": "failed to generate token"})
|
return c.JSON(http.StatusInternalServerError, map[string]string{"error": "failed to generate token"})
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Set HTTP-only cookie for browser-based authentication
|
||||||
|
cookie := &http.Cookie{
|
||||||
|
Name: "token",
|
||||||
|
Value: accessToken,
|
||||||
|
Path: "/",
|
||||||
|
HttpOnly: true,
|
||||||
|
Secure: false,
|
||||||
|
MaxAge: 3600,
|
||||||
|
}
|
||||||
|
c.SetCookie(cookie)
|
||||||
|
|
||||||
_, refreshToken, err := h.CreateRefreshToken(uuid.UUID(user.ID.Bytes))
|
_, refreshToken, err := h.CreateRefreshToken(uuid.UUID(user.ID.Bytes))
|
||||||
if err != nil {
|
if err != nil {
|
||||||
if c.Request().Header.Get("HX-Request") == "true" {
|
if c.Request().Header.Get("HX-Request") == "true" {
|
||||||
@@ -228,7 +239,7 @@ localStorage.setItem('token', '%s');
|
|||||||
localStorage.setItem('refreshToken', '%s');
|
localStorage.setItem('refreshToken', '%s');
|
||||||
localStorage.setItem('user', JSON.stringify(%s));
|
localStorage.setItem('user', JSON.stringify(%s));
|
||||||
document.cookie = 'token=%s; path=/; max-age=3600';
|
document.cookie = 'token=%s; path=/; max-age=3600';
|
||||||
window.location.href = '/bookshelf';
|
window.location.href = '/dashboard';
|
||||||
</script>`, accessToken, refreshToken, fmt.Sprintf(`{"id":"%s","email":"%s","username":"%s"}`, uuid.UUID(user.ID.Bytes).String(), user.Email, user.Username), accessToken)
|
</script>`, accessToken, refreshToken, fmt.Sprintf(`{"id":"%s","email":"%s","username":"%s"}`, uuid.UUID(user.ID.Bytes).String(), user.Email, user.Username), accessToken)
|
||||||
return c.HTML(http.StatusCreated, html)
|
return c.HTML(http.StatusCreated, html)
|
||||||
}
|
}
|
||||||
@@ -348,6 +359,17 @@ func (h *AuthHandler) Login(c echo.Context) error {
|
|||||||
return c.JSON(http.StatusInternalServerError, map[string]string{"error": "failed to generate token"})
|
return c.JSON(http.StatusInternalServerError, map[string]string{"error": "failed to generate token"})
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Set HTTP-only cookie for browser-based authentication
|
||||||
|
cookie := &http.Cookie{
|
||||||
|
Name: "token",
|
||||||
|
Value: accessToken,
|
||||||
|
Path: "/",
|
||||||
|
HttpOnly: true,
|
||||||
|
Secure: false,
|
||||||
|
MaxAge: 3600,
|
||||||
|
}
|
||||||
|
c.SetCookie(cookie)
|
||||||
|
|
||||||
_, refreshToken, err := h.CreateRefreshToken(uuid.UUID(user.ID.Bytes))
|
_, refreshToken, err := h.CreateRefreshToken(uuid.UUID(user.ID.Bytes))
|
||||||
if err != nil {
|
if err != nil {
|
||||||
if c.Request().Header.Get("HX-Request") == "true" {
|
if c.Request().Header.Get("HX-Request") == "true" {
|
||||||
@@ -359,7 +381,7 @@ func (h *AuthHandler) Login(c echo.Context) error {
|
|||||||
if c.Request().Header.Get("HX-Request") == "true" {
|
if c.Request().Header.Get("HX-Request") == "true" {
|
||||||
redirect := c.FormValue("redirect")
|
redirect := c.FormValue("redirect")
|
||||||
if redirect == "" {
|
if redirect == "" {
|
||||||
redirect = "/bookshelf"
|
redirect = "/dashboard"
|
||||||
}
|
}
|
||||||
html := fmt.Sprintf(`<div class="text-green-500">Login successful! Redirecting...</div>
|
html := fmt.Sprintf(`<div class="text-green-500">Login successful! Redirecting...</div>
|
||||||
<script>
|
<script>
|
||||||
|
|||||||
Reference in New Issue
Block a user