بنقرة واحدة
siwa-openfort
Openfort backend wallet integration for SIWA authentication.
التثبيت باستخدام Codex أو Claude انسخ هذا Prompt والصقه في Codex أو Claude أو مساعد آخر ليراجع صفحة Skill ويثبّتها لك.
القائمة
Openfort backend wallet integration for SIWA authentication.
التثبيت باستخدام Codex أو Claude انسخ هذا Prompt والصقه في Codex أو Claude أو مساعد آخر ليراجع صفحة Skill ويثبّتها لك.
استنادا إلى تصنيف SOC المهني
Magic server wallet integration for SIWA authentication.
SIWA (Sign-In With Agent) authentication for ERC-8004 registered agents.
Use this skill to implement server-side SIWA verification. For backends and APIs that need to authenticate ERC-8004 agents without signing capabilities.
Bankr wallet integration for SIWA authentication.
Circle developer-controlled wallet integration for SIWA authentication.
Self-hosted keyring proxy signer with optional 2FA for secure key isolation.
| name | siwa-openfort |
| version | 0.2.0 |
| description | Openfort backend wallet integration for SIWA authentication. |
Sign SIWA messages using Openfort's backend wallets.
npm install @buildersgarden/siwa @openfort/openfort-node
import { createOpenfortSiwaSigner } from "@buildersgarden/siwa/signer";
const signer = await createOpenfortSiwaSigner({
apiKey: process.env.OPENFORT_PROJECT_PUBLISHABLE_KEY!,
walletSecret: process.env.OPENFORT_WALLET_SECRET!,
accountId: process.env.OPENFORT_BACKEND_WALLET_ACCOUNT_ID!,
});
The wallet address is fetched automatically from Openfort.
If you already have an Openfort client instance:
import Openfort from "@openfort/openfort-node";
import { createOpenfortSiwaSignerFromClient } from "@buildersgarden/siwa/signer";
const client = new Openfort(process.env.OPENFORT_PROJECT_PUBLISHABLE_KEY!, {
walletSecret: process.env.OPENFORT_WALLET_SECRET!,
});
const signer = await createOpenfortSiwaSignerFromClient({
client,
accountId: process.env.OPENFORT_BACKEND_WALLET_ACCOUNT_ID!,
});
The authentication flow consists of two steps:
Note: The URLs below (
api.example.com) are placeholders. Replace them with your own server that implements the SIWA verification endpoints. See the Server-Side Verification skill for implementation details.
/siwa/nonce endpoint/siwa/verifyconst nonceRes = await fetch("https://api.example.com/siwa/nonce", {
method: "POST",
headers: { "Content-Type": "application/json" },
body: JSON.stringify({
address: await signer.getAddress(),
agentId: 42,
agentRegistry: "eip155:84532:0x8004A818BFB912233c491871b3d84c89A494BD9e",
}),
});
const { nonce, nonceToken, issuedAt, expirationTime } = await nonceRes.json();
import { signSIWAMessage } from "@buildersgarden/siwa";
const { message, signature, address } = await signSIWAMessage(
{
domain: "api.example.com",
uri: "https://api.example.com/siwa",
agentId: 42,
agentRegistry: "eip155:84532:0x8004A818BFB912233c491871b3d84c89A494BD9e", //According to the chain
chainId: 84532,
nonce,
issuedAt,
expirationTime,
},
signer,
);
// Send to server for verification
const verifyRes = await fetch("https://api.example.com/siwa/verify", {
method: "POST",
headers: { "Content-Type": "application/json" },
body: JSON.stringify({ message, signature, nonceToken }),
});
const { receipt, agentId } = await verifyRes.json();
// Store the receipt for authenticated API calls
import { signAuthenticatedRequest } from "@buildersgarden/siwa/erc8128";
const request = new Request("https://api.example.com/action", {
method: "POST",
headers: { "Content-Type": "application/json" },
body: JSON.stringify({ action: "execute" }),
});
const signedRequest = await signAuthenticatedRequest(
request,
receipt, // from SIWA sign-in
signer,
84532,
);
const response = await fetch(signedRequest);
OPENFORT_PROJECT_PUBLISHABLE_KEY=your-openfort-api-key
OPENFORT_WALLET_SECRET=your-wallet-secret
OPENFORT_BACKEND_WALLET_ACCOUNT_ID=your-account-id