Lightweight and Secure OAuth2 for SolidStart  — Access the name, email, and when available image of authenticated users.
For extended usage, the provider name and access token are included in the oauth object.
Supported Providers: Amazon, Discord, GitHub, Google, LinkedIn, Microsoft, Spotify, X, and Yahoo
Add start-oauth as a dependency
# use preferred package manager
npm add start-oauthCreate a catch-all API route at routes/api/oauth/[...oauth].ts
import OAuth from "start-oauth"; import { redirect } from "@solidjs/router"; export const GET = OAuth({ password: process.env.PASSWORD!, // openssl rand -hex 32 discord: { id: process.env.DISCORD_ID!, secret: process.env.DISCORD_SECRET! }, google: { id: process.env.GOOGLE_ID!, secret: process.env.GOOGLE_SECRET! }, async handler({ name, email, image, oauth }, redirectTo) { // add your logic (e.g. database call, session creation) // const session = await getSession(); // await session.update({ name, email, image }); return redirect( // only allow internal redirects redirectTo?.startsWith("/") && !redirectTo.startsWith("//") ? redirectTo : "/defaultPage" ); } });
In your OAuth provider's dashboard, set the redirect URIs
- Development: http://localhost:3000/api/oauth/[provider]
- Production: https://your-domain.com/api/oauth/[provider]
// for example in routes/login.tsx import { useOAuthLogin } from "start-oauth"; export default function Login() { const login = useOAuthLogin(); return ( <div> <a href={login("discord")} rel="external"> Sign in with Discord </a> <a href={login("google")} rel="external"> Sign in with Google </a> </div> ); }
- To specify a post-login destination, append ?redirect=/dashboardto the login URL—this value is passed as theredirectToparameter to your handler.
- On authentication failure, users are redirected to the login page with ?error=<reason>for custom error handling.
See start-oauth in action with the SolidStart with-auth example
# using npm
npm create solid@latest -- -st with-auth# using pnpm
pnpm create solid@latest -st with-auth# using bun
bun create solid@latest --s --t with-auth- Stateless PKCE with SHA-256 code challenges
- AES-256-GCM encryption for state parameters to prevent tampering
- Timeout-protected HTTP requests to avoid hanging connections
- Strict validation of fallback URLs to prevent open redirects