認証
認証
あなたのアプリケーションへの認証されたアクセスの提供
接続プロセス中にユーザーがウォレットでメッセージに署名することを必要とすることも可能で、これにより接続されたアカウントを所有していることの証明と、アプリケーションへの特権アクセスを持つ認証されたユーザーセッションを作成することができる。
カスタムのバックエンドやメッセージ形式と統合することも可能ですが、RainbowKitはSign-In with EthereumとNextAuthのファーストクラスサポートを提供しています。
@rainbow-me/rainbowkit-siwe-next-authパッケージとNextAuth v5をインストールします。
既存のNextAuth v4 SIWE統合をアップグレードする場合は、NextAuth v5マイグレーションガイドに従ってください。
v5 Credentialsプロバイダーを使用し、authヘルパーをエクスポートするNextAuth構成を作成します。authorizeの実装は、認証されたアドレスを返す前に、SIWEメッセージ、署名、ドメイン、ノンスを検証する必要があります。
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);
SIWE検証、ノンスチェック、サーバー側の検証については、完全なwith-next-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 {
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 propに関数を渡すことにより、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プロパティはユーザーのアドレスになります。
また、NextAuthがクライアント側で再度それを解決する必要がないように、解決済みのセッションオブジェクトをgetServerSideProps経由で渡すこともできます。
例えば:
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>
);
}
セッションの管理に関する詳細は、以下のドキュメンテーションを参照してください: