54 | Login
55 | {isAvailable ? (
56 |
68 | ) : (
69 | Sorry, webauthn is not available.
70 | )}
71 |
72 | );
73 | }
74 |
75 | export const getServerSideProps = withIronSessionSsr(async function ({
76 | req,
77 | res,
78 | }) {
79 | if (isLoggedIn(req)) {
80 | return {
81 | redirect: {
82 | destination: "/admin",
83 | permanent: false,
84 | },
85 | };
86 | }
87 |
88 | const challenge = generateChallenge();
89 | req.session.challenge = challenge;
90 | await req.session.save();
91 |
92 | return { props: { challenge } };
93 | },
94 | sessionOptions);
95 |
--------------------------------------------------------------------------------
/pages/register.tsx:
--------------------------------------------------------------------------------
1 | import { FormEvent, Fragment, useEffect, useState } from "react";
2 | import { supported, create } from "@github/webauthn-json";
3 | import { withIronSessionSsr } from "iron-session/next";
4 | import { generateChallenge, isLoggedIn } from "../lib/auth";
5 | import { sessionOptions } from "../lib/session";
6 | import { useRouter } from "next/router";
7 |
8 | export default function Register({ challenge }: { challenge: string }) {
9 | const router = useRouter();
10 | const [username, setUsername] = useState("");
11 | const [email, setEmail] = useState("");
12 | const [error, setError] = useState("");
13 | const [isAvailable, setIsAvailable] = useState