diff --git a/src/shared/config.ts b/src/shared/config.ts index 58ecc08b..38c521ec 100644 --- a/src/shared/config.ts +++ b/src/shared/config.ts @@ -26,6 +26,7 @@ export const updateUnreadCountsInterval = 30000; export const fetchLimit = 20; export const relTags = "noopener nofollow"; export const emDash = "\u2014"; +export const authCookieName = "jwt"; /** * Accepted formats: diff --git a/src/shared/services/UserService.ts b/src/shared/services/UserService.ts index 3757e236..0724f400 100644 --- a/src/shared/services/UserService.ts +++ b/src/shared/services/UserService.ts @@ -1,7 +1,5 @@ -// import Cookies from 'js-cookie'; import { isAuthPath } from "@utils/app"; -import { isBrowser } from "@utils/browser"; -import { isHttps } from "@utils/env"; +import { clearAuthCookie, isBrowser, setAuthCookie } from "@utils/browser"; import * as cookie from "cookie"; import jwt_decode from "jwt-decode"; import { LoginResponse, MyUserInfo } from "lemmy-js-client"; @@ -31,15 +29,10 @@ export class UserService { public login(res: LoginResponse) { const expires = new Date(); expires.setDate(expires.getDate() + 365); + if (isBrowser() && res.jwt) { toast(I18NextService.i18n.t("logged_in")); - document.cookie = cookie.serialize("jwt", res.jwt, { - expires, - secure: isHttps(), - domain: location.hostname, - sameSite: true, - path: "/", - }); + setAuthCookie(res.jwt); this.#setJwtInfo(); } } @@ -47,14 +40,11 @@ export class UserService { public logout() { this.jwtInfo = undefined; this.myUserInfo = undefined; + if (isBrowser()) { - document.cookie = cookie.serialize("jwt", "", { - maxAge: 0, - path: "/", - domain: location.hostname, - sameSite: true, - }); + clearAuthCookie(); } + if (isAuthPath(location.pathname)) { location.replace("/"); } else { @@ -64,14 +54,17 @@ export class UserService { public auth(throwErr = false): string | undefined { const jwt = this.jwtInfo?.jwt; + if (jwt) { return jwt; } else { const msg = "No JWT cookie found"; + if (throwErr && isBrowser()) { console.error(msg); toast(I18NextService.i18n.t("not_logged_in"), "danger"); } + return undefined; // throw msg; } @@ -80,6 +73,7 @@ export class UserService { #setJwtInfo() { if (isBrowser()) { const { jwt } = cookie.parse(document.cookie); + if (jwt) { this.jwtInfo = { jwt, claims: jwt_decode(jwt) }; } diff --git a/src/shared/utils/browser/clear-auth-cookie.ts b/src/shared/utils/browser/clear-auth-cookie.ts new file mode 100644 index 00000000..f5cc73f1 --- /dev/null +++ b/src/shared/utils/browser/clear-auth-cookie.ts @@ -0,0 +1,10 @@ +import * as cookie from "cookie"; +import { authCookieName } from "../../config"; + +export default function clearAuthCookie() { + document.cookie = cookie.serialize(authCookieName, "", { + maxAge: -1, + sameSite: true, + path: "/", + }); +} diff --git a/src/shared/utils/browser/index.ts b/src/shared/utils/browser/index.ts index d07b16e7..321a4c9f 100644 --- a/src/shared/utils/browser/index.ts +++ b/src/shared/utils/browser/index.ts @@ -1,19 +1,23 @@ import canShare from "./can-share"; +import clearAuthCookie from "./clear-auth-cookie"; import dataBsTheme from "./data-bs-theme"; import isBrowser from "./is-browser"; import isDark from "./is-dark"; import loadCss from "./load-css"; import restoreScrollPosition from "./restore-scroll-position"; import saveScrollPosition from "./save-scroll-position"; +import setAuthCookie from "./set-auth-cookie"; import share from "./share"; export { canShare, + clearAuthCookie, dataBsTheme, isBrowser, isDark, loadCss, restoreScrollPosition, saveScrollPosition, + setAuthCookie, share, }; diff --git a/src/shared/utils/browser/set-auth-cookie.ts b/src/shared/utils/browser/set-auth-cookie.ts new file mode 100644 index 00000000..e7d4300c --- /dev/null +++ b/src/shared/utils/browser/set-auth-cookie.ts @@ -0,0 +1,12 @@ +import { isHttps } from "@utils/env"; +import * as cookie from "cookie"; +import { authCookieName } from "../../config"; + +export default function setAuthCookie(jwt: string) { + document.cookie = cookie.serialize(authCookieName, jwt, { + maxAge: 365 * 24 * 60 * 60 * 1000, + secure: isHttps(), + sameSite: true, + path: "/", + }); +}