Skip to content

Commit c93599f

Browse files
authored
Cookie の path を指定 (#59)
1 parent 34db429 commit c93599f

File tree

5 files changed

+95
-23
lines changed

5 files changed

+95
-23
lines changed

client/src/pages/Home.tsx

Lines changed: 30 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,10 @@ const client = hc<AppType>(API_ENDPOINT);
1313
export default function HomePage() {
1414
const [involvedProjects, setInvolvedProjects] = useState<BriefProject[] | null>(null);
1515
const [loading, setLoading] = useState(true);
16+
const [toast, setToast] = useState<{
17+
message: string;
18+
variant: "success" | "error";
19+
} | null>(null);
1620

1721
useEffect(() => {
1822
const fetchInvolvedProjects = async () => {
@@ -24,10 +28,29 @@ export default function HomePage() {
2428
const parsedData = data.map((p) => briefProjectReviver(p));
2529
setInvolvedProjects(parsedData);
2630
} else {
31+
let errorMessage = "イベントの取得に失敗しました。";
32+
try {
33+
const data = await res.json();
34+
if (data && typeof data.message === "string" && data.message.trim()) {
35+
errorMessage = data.message.trim();
36+
}
37+
} catch (_) {
38+
// レスポンスがJSONでない場合は無視
39+
}
40+
setToast({
41+
message: errorMessage,
42+
variant: "error",
43+
});
44+
setTimeout(() => setToast(null), 5000);
2745
setInvolvedProjects(null);
2846
}
2947
} catch (error) {
3048
console.error("Error fetching involved projects:", error);
49+
setToast({
50+
message: "ネットワークエラーが発生しました。",
51+
variant: "error",
52+
});
53+
setTimeout(() => setToast(null), 5000);
3154
setInvolvedProjects(null);
3255
} finally {
3356
setLoading(false);
@@ -52,6 +75,13 @@ export default function HomePage() {
5275
<EmptyState />
5376
</div>
5477
)}
78+
{toast && (
79+
<div className="toast toast-top toast-center z-50">
80+
<div className={`alert ${toast.variant === "success" ? "alert-success" : "alert-error"}`}>
81+
<span>{toast.message}</span>
82+
</div>
83+
</div>
84+
)}
5585
</>
5686
);
5787
}

client/src/pages/Project.tsx

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -53,9 +53,29 @@ export default function ProjectPage() {
5353
const data = await res.json();
5454
const parsedData = projectReviver(data);
5555
setProject(parsedData);
56+
} else {
57+
let errorMessage = "プロジェクトの取得に失敗しました。";
58+
try {
59+
const data = await res.json();
60+
if (data && typeof data.message === "string" && data.message.trim()) {
61+
errorMessage = data.message.trim();
62+
}
63+
} catch (_) {
64+
// レスポンスがJSONでない場合は無視
65+
}
66+
setToast({
67+
message: errorMessage,
68+
variant: "error",
69+
});
70+
setTimeout(() => setToast(null), 5000);
5671
}
5772
} catch (error) {
5873
console.error(error);
74+
setToast({
75+
message: "ネットワークエラーが発生しました。",
76+
variant: "error",
77+
});
78+
setTimeout(() => setToast(null), 5000);
5979
} finally {
6080
setProjectLoading(false);
6181
}

client/src/pages/eventId/Submission.tsx

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -59,9 +59,29 @@ export default function SubmissionPage() {
5959
const data = await res.json();
6060
const parsedData = projectReviver(data);
6161
setProject(parsedData);
62+
} else {
63+
let errorMessage = "プロジェクトの取得に失敗しました。";
64+
try {
65+
const data = await res.json();
66+
if (data && typeof data.message === "string" && data.message.trim()) {
67+
errorMessage = data.message.trim();
68+
}
69+
} catch (_) {
70+
// レスポンスがJSONでない場合は無視
71+
}
72+
setToast({
73+
message: errorMessage,
74+
variant: "error",
75+
});
76+
setTimeout(() => setToast(null), 5000);
6277
}
6378
} catch (error) {
6479
console.error("Error fetching project:", error);
80+
setToast({
81+
message: "ネットワークエラーが発生しました。",
82+
variant: "error",
83+
});
84+
setTimeout(() => setToast(null), 5000);
6585
} finally {
6686
setProjectLoading(false);
6787
}

server/src/main.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -44,6 +44,7 @@ serve(
4444
const isProduction = process.env.NODE_ENV === "prod";
4545

4646
export const cookieOptions = {
47+
path: "/",
4748
domain: process.env.DOMAIN,
4849
httpOnly: true,
4950
secure: isProduction,

server/src/middleware/browserId.ts

Lines changed: 24 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -38,35 +38,36 @@ export const browserIdMiddleware: MiddlewareHandler = async (c: Context, next) =
3838
return c.json({ message: "サーバー設定エラー" }, 500);
3939
}
4040

41-
let browserId: string | undefined;
42-
let needsReissue = false;
43-
4441
// 新形式 (Hono) を試す
45-
browserId = (await getSignedCookie(c, cookieSecret, COOKIE_NAME)) || undefined;
46-
47-
if (!browserId) {
48-
const rawCookie = getCookie(c, COOKIE_NAME);
49-
50-
if (rawCookie?.startsWith("s:")) {
51-
const legacy = unsignExpressCookie(rawCookie, cookieSecret);
52-
if (legacy) {
53-
browserId = legacy;
54-
needsReissue = true;
55-
}
56-
}
42+
const browserIdHono = (await getSignedCookie(c, cookieSecret, COOKIE_NAME)) || undefined;
43+
if (browserIdHono) {
44+
c.set("browserId", browserIdHono);
45+
return next();
5746
}
5847

59-
if (browserId && needsReissue) {
48+
// "browserId" という Cookie が存在しない場合は新規発行
49+
const rawCookie = getCookie(c, COOKIE_NAME);
50+
if (!rawCookie) {
51+
const browserId = crypto.randomUUID();
6052
await setSignedCookie(c, COOKIE_NAME, browserId, cookieSecret, cookieOptions);
53+
c.set("browserId", browserId);
54+
return next();
6155
}
6256

63-
if (!browserId) {
64-
browserId = crypto.randomUUID();
65-
await setSignedCookie(c, COOKIE_NAME, browserId, cookieSecret, cookieOptions);
57+
// 旧形式(Express)を試す
58+
const browserIdExpress = unsignExpressCookie(rawCookie, cookieSecret);
59+
if (browserIdExpress) {
60+
// 旧形式が有効な場合は新形式で再発行
61+
await setSignedCookie(c, COOKIE_NAME, browserIdExpress, cookieSecret, cookieOptions);
62+
c.set("browserId", browserIdExpress);
63+
return next();
6664
}
6765

68-
// コンテキストに保存(後続のハンドラで c.get('browserId') で取得可能)
69-
c.set("browserId", browserId);
70-
71-
await next();
66+
// ここまで来たら Cookie が不正
67+
return c.json(
68+
{
69+
message: "ブラウザのCookie設定に問題があります。",
70+
},
71+
400,
72+
);
7273
};

0 commit comments

Comments
 (0)