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>
53 lines
2.3 KiB
TypeScript
53 lines
2.3 KiB
TypeScript
"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>
|
||
);
|
||
}
|