Web3身份验证SDK模式 web3-privy

Privy SDK 是一个用于Web3应用的身份验证解决方案,提供钱包登录、嵌入式钱包、社交登录和服务器端验证功能。关键词:Web3身份验证、区块链登录、嵌入式钱包、Privy SDK、多链支持、React集成、DeFi应用开发。

链开发 0 次安装 0 次浏览 更新于 2/23/2026

名称: web3-privy 描述: 用于Web3应用的Privy身份验证SDK模式。在实现基于钱包的身份验证、嵌入式钱包、社交登录或使用Privy进行服务器端验证时使用。涵盖PrivyProvider设置、身份验证方法、嵌入式钱包和wagmi集成。

Privy SDK 模式

设置 (React)

import { PrivyProvider } from "@privy-io/react-auth"

function App() {
  return (
    <PrivyProvider
      appId={process.env.NEXT_PUBLIC_PRIVY_APP_ID!}
      config={{
        loginMethods: ["email", "wallet", "google", "twitter"],
        appearance: {
          theme: "dark",
          accentColor: "#6366f1",
        },
        embeddedWallets: {
          createOnLogin: "users-without-wallets",
        },
        defaultChain: base,
        supportedChains: [mainnet, base, arbitrum],
      }}
    >
      {children}
    </PrivyProvider>
  )
}

身份验证

登录/登出

import { usePrivy } from "@privy-io/react-auth"

function AuthButton() {
  const { login, logout, authenticated, user, ready } = usePrivy()

  if (!ready) return <Spinner />

  if (!authenticated) {
    return <button onClick={login}>登录</button>
  }

  return (
    <div>
      <p>{user?.email?.address || user?.wallet?.address}</p>
      <button onClick={logout}>登出</button>
    </div>
  )
}

身份验证方法

方法 配置键 用户属性
邮箱 "email" user.email.address
钱包 "wallet" user.wallet.address
谷歌 "google" user.google.email
推特 "twitter" user.twitter.username
Discord "discord" user.discord.username
Farcaster "farcaster" user.farcaster.fid
通行密钥 "passkey" user.passkey

用户对象

const { user } = usePrivy()

// 关联账户
const email = user?.email?.address
const walletAddress = user?.wallet?.address
const linkedAccounts = user?.linkedAccounts // 所有关联方法

嵌入式钱包

import { usePrivy, useWallets } from "@privy-io/react-auth"

function WalletActions() {
  const { wallets } = useWallets()

  // 查找嵌入式钱包
  const embeddedWallet = wallets.find((w) => w.walletClientType === "privy")

  // 获取交易提供者
  const provider = await embeddedWallet?.getEthereumProvider()

  // 发送交易
  const txHash = await provider?.request({
    method: "eth_sendTransaction",
    params: [{
      to: recipientAddress,
      value: "0x" + parseEther("0.01").toString(16),
    }],
  })
}

wagmi 集成

import { PrivyProvider } from "@privy-io/react-auth"
import { WagmiProvider, createConfig } from "@privy-io/wagmi"

// Privy 提供自己的 wagmi 配置包装器
import { createConfig as createPrivyWagmiConfig } from "@privy-io/wagmi"

const config = createPrivyWagmiConfig({
  chains: [mainnet, base],
  transports: {
    [mainnet.id]: http(),
    [base.id]: http(),
  },
})

function App() {
  return (
    <PrivyProvider appId={appId}>
      <WagmiProvider config={config}>
        <QueryClientProvider client={queryClient}>
          {children}
        </QueryClientProvider>
      </WagmiProvider>
    </PrivyProvider>
  )
}

// 然后使用标准的 wagmi 钩子
import { useAccount, useBalance, useSendTransaction } from "wagmi"

服务器端验证

import { PrivyClient } from "@privy-io/server-auth"

const privy = new PrivyClient(
  process.env.PRIVY_APP_ID!,
  process.env.PRIVY_APP_SECRET!,
)

// 验证身份验证令牌 (API 路由 / 中间件)
async function verifyAuth(req: Request) {
  const token = req.headers.get("authorization")?.replace("Bearer ", "")
  if (!token) throw new Error("无令牌")

  const { userId } = await privy.verifyAuthToken(token)
  return userId
}

// 通过 ID 获取用户
const user = await privy.getUser(userId)

多链钱包支持

// Privy 支持 EVM 和 Solana 钱包
const config = {
  embeddedWallets: {
    createOnLogin: "users-without-wallets",
    // Solana 嵌入式钱包
    solana: { createOnLogin: "users-without-wallets" },
  },
  supportedChains: [mainnet, base, arbitrum, polygon],
}

// 访问 Solana 钱包
import { useSolanaWallets } from "@privy-io/react-auth/solana"
const { wallets: solanaWallets } = useSolanaWallets()

常见模式

受保护的路由

function ProtectedPage() {
  const { ready, authenticated } = usePrivy()

  if (!ready) return <Loading />
  if (!authenticated) return <Redirect to="/login" />

  return <Dashboard />
}

链接其他账户

const { linkEmail, linkWallet, linkGoogle } = usePrivy()

// 用户可以将多个身份验证方法链接到一个账户
await linkEmail() // 打开邮箱验证流程
await linkWallet() // 打开钱包连接