Skip to content

Instantly share code, notes, and snippets.

@ryanflorence
Created November 17, 2021 20:57
Show Gist options
  • Star 1 You must be signed in to star a gist
  • Fork 1 You must be signed in to fork a gist
  • Save ryanflorence/0bcc70851d0c9f621af42b60013d916c to your computer and use it in GitHub Desktop.
Save ryanflorence/0bcc70851d0c9f621af42b60013d916c to your computer and use it in GitHub Desktop.
// root.tsx
import { getUserSession, requireUser, logout } from "~/session";
export function loader({ request }) {
// use case: know if the user is logged in, no redirect to /login
let userSession = await getUserSession(request);
let isAuthenticated = userSession.has("userId");
return { isAuthenticated };
}
// dashboard.tsx
export function loader({ request }) {
// use case: redirect to login if they aren't logged in
let userId = await requireUser(request);
return db.jokes.findWhere({ userId });
}
// logout.tsx
export function action({ request }) {
// use case: redirect to login if they aren't logged in
return logout(request);
}
// login.tsx
export function action({ request }) {
let data = await request.formData();
let email = data.get("email");
let password = data.get("password");
if (typeof email !== "string" || typeof password !== "string") {
return "Both email and password are required";
}
// do additional validation
let userId = users.findOne({ where: { email } });
// compare password hashes
// if it matches?
return createUserSession(userId, "/dashboard");
}
```
```tsx
// session.ts
import { redirect } from "remix";
let { getSession, commitSession, destroySession } = createCookieSessionStorage({
cookie: {
// browser handles expiration
expires: "...",
},
});
export function getUserSession(request) {
return getSession(request.headers.get("Cookie"));
}
export function requireUser(request) {
let session = getSession(request.headers.get("Cookie"));
if (!session.has("userId")) {
throw redirect("/login");
}
let userId = session.get("userId");
invariant(userId, "expected userId on session");
return userId;
}
export function logout(request) {
let session = getSession(request.headers.get("Cookie"));
return redirect("/login", { headers: await destroySession(session) });
}
export function createUserSession(userId, redirectTo) {
let session = getSession();
session.set("userId", userId);
return redirect(redirect, {
headers: { cookie: await commitSession(session) },
});
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment