Files
kolaytercih/src/features/kullanici/components/giris-linki.tsx
bilalgursen 248a01042f fix(giris): callback yalnız better-auth'un kabul ettiği yollarda takılır
better-auth 1.6.23 callback'i kendi göreli-yol kalkanından geçiriyor ve \w
ASCII olduğu için /rehber/ösym ya da /bolum/t%C4%B1p gibi yolları 403
INVALID_CALLBACK_URL ile reddediyordu: kullanıcı o sayfalardan hiç giriş
yapamıyordu. Callback artık yalnız auth'un da kabul edeceği yollarda
takılıyor, gerisinde sade /giris'e düşülüyor.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-09-22 01:36:59 +03:00

53 lines
2.3 KiB
TypeScript
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
"use client";
import Link from "next/link";
import { usePathname } from "next/navigation";
import { Button } from "@/components/ui/button";
/**
* Navbar'ın "Giriş yap" butonu: giriş bitince kullanıcıyı **bulunduğu
* sayfaya** geri döndürür (`/giris?callback=<yol>`). Callback verilmezse
* `giris-karti.tsx` "/"'a düşürüyordu — rehber okuyan ziyaretçi girişten
* sonra ana sayfada uyanıyordu.
*
* Callback neden sabit bir hedef (ör. `/listem`) değil: buton her sayfada
* duruyor, sabit hedef bağlam kaybı olurdu; `/listem?uret=1` yazılsaydı
* girişten dönüşte üretim kendiliğinden başlar ve kullanıcının ayrı onayı
* olmadan 3 kredi yakardı.
*
* Callback yalnız pathname taşır: sorgu dizesini okuyan kanca tüm navbar'ı
* Suspense zorunluluğuna sokardı. `usePathname` bu ağaçta zaten var
* (`header-gate`), `UserNav` da site-header'da Suspense içinde render
* ediliyor — cacheComponents açıkken dinamik parametreli rotalarda gereken
* sınır hazır (next/dist/docs/.../use-pathname.md).
*/
/**
* better-auth (1.6.23) callback'i kendi göreli-yol kalkanından geçiriyor:
* `^\/(?!\/|\\|%2f|%5c)[\w\-.+/@]*(?:\?…)?$`. `\w` ASCII olduğu için
* `/rehber/ösym` ya da yüzde-kodlanmış `/bolum/t%C4%B1p` gibi yollar
* **403 INVALID_CALLBACK_URL** ile reddediliyor ve kullanıcı o sayfadan hiç
* giriş yapamıyor (main'de callback hep "/" olduğu için bu yol yoktu).
* Bu yüzden callback'i ancak auth katmanının da kabul edeceği yollarda
* takıyoruz; gerisinde sade /giris'e düşüyoruz — bağlam kaybı, kırık giriş
* akışına yeğdir. Kalkan daraltılırsa (tek yer) buradaki de gevşetilebilir.
*/
const AUTH_GUVENLI_YOL = /^\/(?!\/|\\)[\w\-./+@]*$/;
export function GirisLinki() {
const pathname = usePathname();
// /giris kendine callback veremez (döngü); pathname yoksa sade hedef.
const href =
pathname && !pathname.startsWith("/giris") && AUTH_GUVENLI_YOL.test(pathname)
? `/giris?callback=${encodeURIComponent(pathname)}`
: "/giris";
return (
<Button
asChild
className="h-9 cursor-pointer rounded-full bg-slate-900 px-3.5 text-sm font-medium text-white transition-colors duration-200 hover:bg-slate-700 sm:h-12 sm:px-7 sm:text-base"
>
<Link href={href}>Giriş yap</Link>
</Button>
);
}