Remove Google and GitHub sign-in

Both providers were registered but never usable: all four client
env vars are empty in production and no Account row has ever been
created. Email and password is the only path that has ever worked.

This also simplifies the invite gating that follows. With OAuth there
were two redemption paths, an invite token that had to survive the
provider round trip in a SameSite=Lax cookie, and an
OAuthAccountNotLinked dead end for anyone who signed up with a password
and later clicked a provider button. Now there is one path.

Account, Session and VerificationToken stay in the schema. They are
Auth.js's tables and dropping them would be a destructive migration for
no benefit.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
This commit is contained in:
JP
2026-08-08 20:42:40 +00:00
parent b3a0cc75eb
commit f0c745c50c
4 changed files with 4 additions and 74 deletions

View File

@@ -9,11 +9,6 @@ NEXTAUTH_URL="http://localhost:3000"
NEXTAUTH_SECRET="generate-with: openssl rand -base64 32" NEXTAUTH_SECRET="generate-with: openssl rand -base64 32"
AUTH_TRUST_HOST="true" # Set to true when behind a reverse proxy AUTH_TRUST_HOST="true" # Set to true when behind a reverse proxy
# OAuth Providers
GOOGLE_CLIENT_ID=""
GOOGLE_CLIENT_SECRET=""
GITHUB_CLIENT_ID=""
GITHUB_CLIENT_SECRET=""
# MinIO / S3-compatible storage # MinIO / S3-compatible storage
MINIO_ENDPOINT="localhost" MINIO_ENDPOINT="localhost"

View File

@@ -255,12 +255,6 @@ if [[ "$SKIP_CONFIG" == "false" ]]; then
echo -e "${BOLD}AI Gateway:${NC}" echo -e "${BOLD}AI Gateway:${NC}"
prompt_value SWITCHBOARD_URL "Switchboard gateway URL" "http://192.168.2.11:8787/v1" prompt_value SWITCHBOARD_URL "Switchboard gateway URL" "http://192.168.2.11:8787/v1"
echo ""
echo -e "${BOLD}OAuth Providers (optional — press Enter to skip):${NC}"
prompt_value GOOGLE_CID "Google Client ID" ""
prompt_value GOOGLE_CS "Google Client Secret" ""
prompt_value GITHUB_CID "GitHub Client ID" ""
prompt_value GITHUB_CS "GitHub Client Secret" ""
# Build DATABASE_URL # Build DATABASE_URL
DATABASE_URL="postgresql://${PG_USER}:${PG_PASSWORD}@localhost:5432/${PG_DB}" DATABASE_URL="postgresql://${PG_USER}:${PG_PASSWORD}@localhost:5432/${PG_DB}"
@@ -282,11 +276,6 @@ NEXTAUTH_URL="${APP_URL}"
NEXTAUTH_SECRET="${AUTH_SECRET}" NEXTAUTH_SECRET="${AUTH_SECRET}"
AUTH_TRUST_HOST="true" AUTH_TRUST_HOST="true"
# ─── OAuth Providers ─────────────────────────────────────
GOOGLE_CLIENT_ID="${GOOGLE_CID}"
GOOGLE_CLIENT_SECRET="${GOOGLE_CS}"
GITHUB_CLIENT_ID="${GITHUB_CID}"
GITHUB_CLIENT_SECRET="${GITHUB_CS}"
# ─── MinIO / S3-compatible storage ─────────────────────── # ─── MinIO / S3-compatible storage ───────────────────────
MINIO_ENDPOINT="localhost" MINIO_ENDPOINT="localhost"
@@ -418,7 +407,4 @@ echo -e " ${BOLD}${YELLOW}Next steps:${NC}"
echo " 1. Open ${APP_URL_CHECK} and create your account" echo " 1. Open ${APP_URL_CHECK} and create your account"
echo " 2. Add your Switchboard API key in Settings" echo " 2. Add your Switchboard API key in Settings"
echo " 3. Set up a reverse proxy (nginx/Caddy) for HTTPS" echo " 3. Set up a reverse proxy (nginx/Caddy) for HTTPS"
if [[ -z "${GOOGLE_CID:-}" ]] && [[ -z "${GITHUB_CID:-}" ]]; then
echo " 4. (Optional) Add OAuth providers in $ENV_FILE"
fi
echo "" echo ""

View File

@@ -8,7 +8,6 @@ import { Button } from "@/components/ui/button"
import { Input } from "@/components/ui/input" import { Input } from "@/components/ui/input"
import { Label } from "@/components/ui/label" import { Label } from "@/components/ui/label"
import { Card, CardContent, CardDescription, CardHeader, CardTitle } from "@/components/ui/card" import { Card, CardContent, CardDescription, CardHeader, CardTitle } from "@/components/ui/card"
import { Separator } from "@/components/ui/separator"
export default function LoginPage() { export default function LoginPage() {
const [email, setEmail] = useState("") const [email, setEmail] = useState("")
@@ -93,50 +92,6 @@ export default function LoginPage() {
</Button> </Button>
</form> </form>
<div className="flex items-center gap-3 py-4">
<Separator className="flex-1" />
<span className="text-xs text-muted-foreground">or</span>
<Separator className="flex-1" />
</div>
<div className="space-y-3">
<Button
variant="outline"
className="w-full"
onClick={() => signIn("google", { callbackUrl: "/dashboard" })}
>
<svg className="mr-2 h-4 w-4" viewBox="0 0 24 24">
<path
fill="currentColor"
d="M22.56 12.25c0-.78-.07-1.53-.2-2.25H12v4.26h5.92a5.06 5.06 0 0 1-2.2 3.32v2.77h3.57c2.08-1.92 3.28-4.74 3.28-8.1z"
/>
<path
fill="currentColor"
d="M12 23c2.97 0 5.46-.98 7.28-2.66l-3.57-2.77c-.98.66-2.23 1.06-3.71 1.06-2.86 0-5.29-1.93-6.16-4.53H2.18v2.84C3.99 20.53 7.7 23 12 23z"
/>
<path
fill="currentColor"
d="M5.84 14.09c-.22-.66-.35-1.36-.35-2.09s.13-1.43.35-2.09V7.07H2.18C1.43 8.55 1 10.22 1 12s.43 3.45 1.18 4.93l2.85-2.22.81-.62z"
/>
<path
fill="currentColor"
d="M12 5.38c1.62 0 3.06.56 4.21 1.64l3.15-3.15C17.45 2.09 14.97 1 12 1 7.7 1 3.99 3.47 2.18 7.07l3.66 2.84c.87-2.6 3.3-4.53 6.16-4.53z"
/>
</svg>
Continue with Google
</Button>
<Button
variant="outline"
className="w-full"
onClick={() => signIn("github", { callbackUrl: "/dashboard" })}
>
<svg className="mr-2 h-4 w-4" viewBox="0 0 24 24" fill="currentColor">
<path d="M12 0c-6.626 0-12 5.373-12 12 0 5.302 3.438 9.8 8.207 11.387.599.111.793-.261.793-.577v-2.234c-3.338.726-4.033-1.416-4.033-1.416-.546-1.387-1.333-1.756-1.333-1.756-1.089-.745.083-.729.083-.729 1.205.084 1.839 1.237 1.839 1.237 1.07 1.834 2.807 1.304 3.492.997.107-.775.418-1.305.762-1.604-2.665-.305-5.467-1.334-5.467-5.931 0-1.311.469-2.381 1.236-3.221-.124-.303-.535-1.524.117-3.176 0 0 1.008-.322 3.301 1.23.957-.266 1.983-.399 3.003-.404 1.02.005 2.047.138 3.006.404 2.291-1.552 3.297-1.23 3.297-1.23.653 1.653.242 2.874.118 3.176.77.84 1.235 1.911 1.235 3.221 0 4.609-2.807 5.624-5.479 5.921.43.372.823 1.102.823 2.222v3.293c0 .319.192.694.801.576 4.765-1.589 8.199-6.086 8.199-11.386 0-6.627-5.373-12-12-12z" />
</svg>
Continue with GitHub
</Button>
</div>
<p className="mt-4 text-center text-sm text-muted-foreground"> <p className="mt-4 text-center text-sm text-muted-foreground">
Don&apos;t have an account?{" "} Don&apos;t have an account?{" "}
<Link href="/register" className="text-primary underline-offset-4 hover:underline"> <Link href="/register" className="text-primary underline-offset-4 hover:underline">

View File

@@ -1,6 +1,4 @@
import NextAuth from "next-auth" import NextAuth from "next-auth"
import Google from "next-auth/providers/google"
import GitHub from "next-auth/providers/github"
import Credentials from "next-auth/providers/credentials" import Credentials from "next-auth/providers/credentials"
import { PrismaAdapter } from "@auth/prisma-adapter" import { PrismaAdapter } from "@auth/prisma-adapter"
import { prisma } from "@/lib/prisma" import { prisma } from "@/lib/prisma"
@@ -13,15 +11,11 @@ import { rateLimit } from "@/lib/rate-limit"
*/ */
const PUBLIC_ROUTES = ["/login", "/register", "/share"] const PUBLIC_ROUTES = ["/login", "/register", "/share"]
// Email and password only. Google and GitHub were configured but never had
// credentials set and no account ever linked to them, and dropping them keeps
// invite redemption to a single path - no carrying an invite token through an
// OAuth round trip, and no OAuthAccountNotLinked dead end for members.
const providers = [ const providers = [
Google({
clientId: process.env.GOOGLE_CLIENT_ID,
clientSecret: process.env.GOOGLE_CLIENT_SECRET,
}),
GitHub({
clientId: process.env.GITHUB_CLIENT_ID,
clientSecret: process.env.GITHUB_CLIENT_SECRET,
}),
Credentials({ Credentials({
name: "Email", name: "Email",
credentials: { credentials: {