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 الخاص بك، قم باستيراد RainbowKitSiweNextAuthProvider.

import { RainbowKitSiweNextAuthProvider } from '@rainbow-me/rainbowkit-siwe-next-auth';

قم بتغليف RainbowKitProvider بـ RainbowKitSiweNextAuthProvider، مع التأكد من أنه مدمج داخل SessionProvider الخاص بـNextAuth حتى يتمكن من الوصول إلى الجلسة.

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 عن طريق تمرير دالة إلى الخاصية 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>;

يمكنك الوصول إلى الجلسة باستخدام وظيفة auth التي تصدرها من تكوين المصادقة الخاص بك. إذا كان المستخدم قد نجح في المصادقة، ستكون خاصية address في الجلسة هي عنوان المستخدم.

يمكنك أيضًا تمرير كائن الجلسة المستقر من الخادم عبر 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>
);
}

لمزيد من المعلومات حول إدارة الجلسة، يمكنك الرجوع إلى التوثيق التالي: