
Remix Auth
Simple Authentication for Remix
Features
- Server-Side Authentication.
- TypeScript Support.
- OAuth2 Support
- User+Password Auth Support
Overview
Remix Auth is a complete open source authentication solution for Remix.run applications.
It was heavily inspired by Passport.js, but completely rewrote it from scratch to work on top of the Web Fetch API.
Getting Started
npm install --save remix-auth
Example with the Local Strategy
Create your session storage
import { createCookieSessionStorage } from "remix";
export let sessionStorage = createCookieSessionStorage({
cookie: {
name: "_session",
sameSite: "lax",
path: "/",
httpOnly: true,
secrets: ["s3cr3t"],
secure: process.env.NODE_ENV === "production",
},
});
export let { getSession, commitSession, destroySession } = sessionStorage;
Setup Remix Auth
import { Authenticator, LocalStrategy } from "remix-auth";
import { sessionStorage } from "~/session.server";
import { User, findOrCreateUser } from "~/models/user";
export let authenticator = new Authenticator<User>(sessionStorage);
authenticator.use(
new LocalStrategy(
{ loginURL: "/login" },
async (username, password) => {
let user = await findOrCreateUser({ username });
await user.validatePassword(password);
return user;
}
),
"local"
);
Setup your routes
import { ActionFunction, LoaderFunction, redirect } from "remix";
import { authenticator } from "~/auth.server";
export let action: ActionFunction = async ({ request }) => {
await authenticator.authenticate("local", request, {
successRedirect: "/dashboard",
failureRedirect: "/login",
});
};
export let loader: LoaderFunction = async ({ request }) => {
await authenticator.isAuthenticated(request, {
successRedirect: "/dashboard",
});
};
export default function Login() {
return (
<form action="/login" method="post">
<input type="text" name="username" required />
<input type="password" name="password" required />
<button>Log In</button>
</form>
);
}