名称: 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() // 打开钱包连接