身份驗證
身份驗證
為你的應用程式提供已驗證的訪問
您可以選擇強制用戶在連接過程中使用錢包簽署消息,證明他們擁有已連接的帳戶,並允許您創建具備特權訪問的認證用戶會話,以訪問您的應用程式。
雖然可以整合自訂後端和訊息格式,但RainbowKit 提供對 以太坊登入 和 NextAuth 的一流支援。
安裝 @rainbow-me/rainbowkit-siwe-next-auth
套件。
npm install @rainbow-me/rainbowkit-siwe-next-auth
在App
組件中,導入RainbowKitSiweNextAuthProvider
。
import { RainbowKitSiweNextAuthProvider } from '@rainbow-me/rainbowkit-siwe-next-auth';
用RainbowKitSiweNextAuthProvider
包裝RainbowKitProvider
,確保它嵌套在NextAuth的SessionProvider
內,以便能夠訪問會話。
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 {
QueryClientProvider,
QueryClient,
} 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
,您的用戶現在會在連接他們的錢包後被提示通過簽署消息進行認證。
您可以透過將函數傳遞至 RainbowKitSiweNextAuthProvider
上的 getSiweMessageOptions
屬性來自訂 SIWE 訊息選項。
每當創建一條新消息時,這個函數就會被調用。 從這個函數返回的選項將與默認選項合併。
import {
RainbowKitSiweNextAuthProvider,
GetSiweMessageOptions,
} from '@rainbow-me/rainbowkit-siwe-next-auth';
const getSiweMessageOptions: GetSiweMessageOptions = () => ({
statement: 'Sign in to my RainbowKit app',
});
<RainbowKitSiweNextAuthProvider
getSiweMessageOptions={getSiweMessageOptions}
>
...
</RainbowKitSiweNextAuthProvider>;
您可以使用next-auth/jwt
中導入的NextAuth函數getToken
來訪問會話令牌。 如果用戶成功驗證,會話令牌的sub
屬性(令牌的"主題",即用戶)將是用戶的地址。
您也可以通過getServerSideProps
從伺服器傳遞解析的會話對象,以便NextAuth不需要在客戶端再次解析它。
例如:
import { GetServerSideProps, InferGetServerSidePropsType } from 'next';
import { getSession } from 'next-auth/react';
import { getToken } from 'next-auth/jwt';
import React from 'react';
export const getServerSideProps: GetServerSideProps = async context => {
const session = await getSession(context);
const token = await getToken({ req: context.req });
const address = token?.sub ?? 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>
);
}
有關管理會話的更多信息,您可以參考以下文檔: