การตรวจสอบตัวตน
การตรวจสอบตัวตน
การให้การเข้าถึงที่ผ่านการตรวจสอบตัวตนไปยังแอปพลิเคชันของคุณ
คุณสามารถเลือกที่จะบังคับให้ผู้ใช้ลงชื่อเข้าใช้ด้วยการส่งข้อความโดยใช้กระเป๋าเงินของพวกเขาระหว่างการเชื่อมต่อ ซึ่งจะพิสูจน์ว่าพวกเขาเป็นเจ้าของบัญชีที่เชื่อมต่อและให้คุณสร้างเซสชันผู้ใช้ที่ผ่านการตรวจสอบตัวตนด้วยการเข้าถึงแบบพิเศษไปยังแอปพลิเคชันของคุณ.
ทั้งนี้เป็นไปได้ที่จะรวมกับแบ็กเอนด์ที่กำหนดเองและรูปแบบข้อความ แต่ RainbowKit ให้การสนับสนุนระดับต้น ๆ สำหรับ การเข้าสู่ระบบด้วย Ethereum และ NextAuth.
ติดตั้งแพคเกจ @rainbow-me/rainbowkit-siwe-next-auth และ NextAuth v5.
ถ้าคุณกำลังอัปเกรดการบูรณาการ SIWE ที่มีอยู่จาก NextAuth v4 โปรดดำเนินการตาม คู่มือย้ายข้าม NextAuth v5.
สร้างการกำหนดค่า NextAuth ที่ใช้ผู้ให้บริการ Credentials v5 และส่งออกตัวช่วย auth. การดำเนินการ authorize ของคุณควรยืนยันข้อความ SIWE ลายเซ็น โดเมน และ nonce ก่อนที่จะส่งคืนที่อยู่ที่ได้ผ่านการรับรองแล้ว.
import NextAuth from 'next-auth';
import type { NextAuthConfig } from 'next-auth';
import Credentials from 'next-auth/providers/credentials';
export const authOptions: NextAuthConfig = {
providers: [
Credentials({
name: 'Ethereum',
credentials: {
message: { label: 'Message', type: 'text' },
signature: { label: 'Signature', type: 'text' },
},
async authorize(credentials) {
const siweMessage = await validateSiweCredentials(credentials);
if (!siweMessage) {
return null;
}
return {
id: siweMessage.address,
};
},
}),
],
secret: process.env.AUTH_SECRET ?? process.env.NEXTAUTH_SECRET,
session: {
strategy: 'jwt',
},
};
export const { handlers, auth, signIn, signOut } = NextAuth(authOptions);
ดู ตัวอย่าง with-next-siwe-next-auth แบบสมบูรณ์ สำหรับการยืนยัน SIWE, การตรวจสอบ nonce และการยืนยันด้านเซิร์ฟเวอร์.
ในส่วนของคอมโพเนนต์ App ของคุณ, ทำการ import RainbowKitSiweNextAuthProvider.
import { RainbowKitSiweNextAuthProvider } from '@rainbow-me/rainbowkit-siwe-next-auth';
หุ้มส่วนของ RainbowKitProvider ด้วย RainbowKitSiweNextAuthProvider, โดยที่ต้องการยังอยู่ภายใน SessionProvider ของ NextAuth เพื่อให้เข้าถึง session ได้.
import { RainbowKitSiweNextAuthProvider } from '@rainbow-me/rainbowkit-siwe-next-auth';
import { RainbowKitProvider } from '@rainbow-me/rainbowkit';
import { SessionProvider } from 'next-auth/react';
import type { Session } from 'next-auth';
import { AppProps } from 'next/app';
import { WagmiProvider } from 'wagmi';
import {
QueryClient,
QueryClientProvider,
} from '@tanstack/react-query';
const queryClient = new QueryClient();
export default function App({
Component,
pageProps,
}: AppProps<{
session: Session;
}>) {
return (
<WagmiProvider {...etc}>
<SessionProvider refetchInterval={0} session={pageProps.session}>
<QueryClientProvider client={queryClient}>
<RainbowKitSiweNextAuthProvider>
<RainbowKitProvider {...etc}>
<Component {...pageProps} />
</RainbowKitProvider>
</RainbowKitSiweNextAuthProvider>
</QueryClientProvider>
</SessionProvider>
</WagmiProvider>
);
}
ด้วย RainbowKitSiweNextAuthProvider ที่ถูกตั้งไว้, ผู้ใช้ของคุณจะถูกพิจารณาเพื่อยืนยันตัวตนโดยการลงนามในข้อความหลังจากที่เชื่อมต่อกระเป๋าเงินของพวกเขา.
คุณสามารถปรับแต่งตัวเลือกข้อความ SIWE โดยการส่งฟังก์ชันไปยัง prop getSiweMessageOptions บน RainbowKitSiweNextAuthProvider.
ฟังก์ชันนี้จะถูกเรียกทุกครั้งที่มีการสร้างข้อความใหม่ ตัวเลือกที่กลับมาจากฟังก์ชันนี้จะถูกผสานกับค่าเริ่มต้น.
import {
RainbowKitSiweNextAuthProvider,
GetSiweMessageOptions,
} from '@rainbow-me/rainbowkit-siwe-next-auth';
const getSiweMessageOptions: GetSiweMessageOptions = () => ({
statement: 'Sign in to my RainbowKit app',
});
<RainbowKitSiweNextAuthProvider
getSiweMessageOptions={getSiweMessageOptions}
>
...
</RainbowKitSiweNextAuthProvider>;
คุณสามารถเข้าถึง session ได้โดยใช้ฟังก์ชัน auth ที่ถูกส่งออกมาจากการตั้งค่าการรับรองสิทธิ์ของคุณ หากผู้ใช้ได้รับการรับรองสำเร็จ คุณสมบัติ address ของ session จะเป็นที่อยู่ของผู้ใช้.
คุณยังสามารถส่งต่อวัตถุเซสชันที่ได้รับการแก้ไขจากเซิร์ฟเวอร์ผ่าน getServerSideProps ให้ NextAuth ไม่จำเป็นต้องแก้ไขอีกครั้งทางลูกค้า.
ตัวอย่างเช่น:
import { GetServerSideProps, InferGetServerSidePropsType } from 'next';
import { auth } from '../auth';
export const getServerSideProps: GetServerSideProps = async context => {
const session = await auth(context.req, context.res);
const address = session?.address ?? null;
return {
props: {
address,
session,
},
};
};
type AuthenticatedPageProps = InferGetServerSidePropsType<
typeof getServerSideProps
>;
export default function AuthenticatedPage({
address,
}: AuthenticatedPageProps) {
return address ? (
<h1>Authenticated as {address}</h1>
) : (
<h1>Unauthenticated</h1>
);
}
สำหรับข้อมูลเพิ่มเติมเกี่ยวกับการจัดการเซสชัน คุณสามารถอ้างอิงเอกสารต่อไปนี้: