|
|
@@ -12,15 +12,11 @@ import (
|
|
|
)
|
|
|
|
|
|
type AuthHandler struct {
|
|
|
- authSvc AuthService
|
|
|
- isProd bool
|
|
|
+ authSvc AuthService
|
|
|
}
|
|
|
|
|
|
-func NewAuthHandler(authSvc AuthService, appEnv string) *AuthHandler {
|
|
|
- return &AuthHandler{
|
|
|
- authSvc: authSvc,
|
|
|
- isProd: appEnv == "production",
|
|
|
- }
|
|
|
+func NewAuthHandler(authSvc AuthService) *AuthHandler {
|
|
|
+ return &AuthHandler{authSvc: authSvc}
|
|
|
}
|
|
|
|
|
|
type registerRequest struct {
|
|
|
@@ -62,7 +58,7 @@ func (h *AuthHandler) Register(w http.ResponseWriter, r *http.Request) {
|
|
|
return
|
|
|
}
|
|
|
|
|
|
- setRefreshTokenCookie(w, refreshToken, h.isProd)
|
|
|
+ setRefreshTokenCookie(w, refreshToken, r)
|
|
|
writeJSON(w, http.StatusCreated, result)
|
|
|
}
|
|
|
|
|
|
@@ -101,7 +97,7 @@ func (h *AuthHandler) Login(w http.ResponseWriter, r *http.Request) {
|
|
|
return
|
|
|
}
|
|
|
|
|
|
- setRefreshTokenCookie(w, refreshToken, h.isProd)
|
|
|
+ setRefreshTokenCookie(w, refreshToken, r)
|
|
|
writeJSON(w, http.StatusOK, result)
|
|
|
}
|
|
|
|
|
|
@@ -115,16 +111,16 @@ func (h *AuthHandler) Refresh(w http.ResponseWriter, r *http.Request) {
|
|
|
result, newRefreshToken, err := h.authSvc.RefreshSession(r.Context(), refreshToken)
|
|
|
if err != nil {
|
|
|
if errors.Is(err, services.ErrTokenReused) {
|
|
|
- h.clearRefreshTokenCookie(w)
|
|
|
+ h.clearRefreshTokenCookie(w, r)
|
|
|
writeError(w, http.StatusUnauthorized, "token reused, session revoked", err)
|
|
|
return
|
|
|
}
|
|
|
- h.clearRefreshTokenCookie(w)
|
|
|
+ h.clearRefreshTokenCookie(w, r)
|
|
|
writeError(w, http.StatusUnauthorized, "invalid or expired refresh token", err)
|
|
|
return
|
|
|
}
|
|
|
|
|
|
- setRefreshTokenCookie(w, newRefreshToken, h.isProd)
|
|
|
+ setRefreshTokenCookie(w, newRefreshToken, r)
|
|
|
writeJSON(w, http.StatusOK, result)
|
|
|
}
|
|
|
|
|
|
@@ -133,7 +129,7 @@ func (h *AuthHandler) Logout(w http.ResponseWriter, r *http.Request) {
|
|
|
if refreshToken != "" {
|
|
|
_ = h.authSvc.RevokeSession(r.Context(), refreshToken)
|
|
|
}
|
|
|
- h.clearRefreshTokenCookie(w)
|
|
|
+ h.clearRefreshTokenCookie(w, r)
|
|
|
w.WriteHeader(http.StatusNoContent)
|
|
|
}
|
|
|
|
|
|
@@ -157,9 +153,10 @@ func (h *AuthHandler) Me(w http.ResponseWriter, r *http.Request) {
|
|
|
writeJSON(w, http.StatusOK, user)
|
|
|
}
|
|
|
|
|
|
-func (h *AuthHandler) clearRefreshTokenCookie(w http.ResponseWriter) {
|
|
|
+func (h *AuthHandler) clearRefreshTokenCookie(w http.ResponseWriter, r *http.Request) {
|
|
|
+ secure := isSecure(r)
|
|
|
sameSite := http.SameSiteLaxMode
|
|
|
- if h.isProd {
|
|
|
+ if secure {
|
|
|
sameSite = http.SameSiteStrictMode
|
|
|
}
|
|
|
cookie := &http.Cookie{
|
|
|
@@ -167,7 +164,7 @@ func (h *AuthHandler) clearRefreshTokenCookie(w http.ResponseWriter) {
|
|
|
Value: "",
|
|
|
Path: "/",
|
|
|
HttpOnly: true,
|
|
|
- Secure: h.isProd,
|
|
|
+ Secure: secure,
|
|
|
SameSite: sameSite,
|
|
|
MaxAge: -1,
|
|
|
}
|