Rainbow logo
RainbowKit
2.2.11

การตรวจสอบตัวตน

การตรวจสอบตัวตน

การให้การเข้าถึงที่ผ่านการตรวจสอบตัวตนไปยังแอปพลิเคชันของคุณ

คุณสามารถเลือกที่จะบังคับให้ผู้ใช้ลงชื่อเข้าใช้ด้วยการส่งข้อความโดยใช้กระเป๋าเงินของพวกเขาระหว่างการเชื่อมต่อ ซึ่งจะพิสูจน์ว่าพวกเขาเป็นเจ้าของบัญชีที่เชื่อมต่อและให้คุณสร้างเซสชันผู้ใช้ที่ผ่านการตรวจสอบตัวตนด้วยการเข้าถึงแบบพิเศษไปยังแอปพลิเคชันของคุณ.

ทั้งนี้เป็นไปได้ที่จะรวมกับแบ็กเอนด์ที่กำหนดเองและรูปแบบข้อความ แต่ RainbowKit ให้การสนับสนุนระดับต้น ๆ สำหรับ การเข้าสู่ระบบด้วย Ethereum และ NextAuth.

ติดตั้งแพคเกจ @rainbow-me/rainbowkit-siwe-next-auth และ NextAuth v5.

npm install @rainbow-me/rainbowkit-siwe-next-auth [email protected]

ถ้าคุณกำลังอัปเกรดการบูรณาการ 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;
// If you have a value for "address" here, your
// server knows the user is authenticated.
// You can then pass any data you want
// to the page component here.
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>
);
}

สำหรับข้อมูลเพิ่มเติมเกี่ยวกับการจัดการเซสชัน คุณสามารถอ้างอิงเอกสารต่อไปนี้: