@randombits/use-siwe
Version:
React hook and API endpoints that provide Sign In With Ethereum support
1 lines • 7.22 kB
Source Map (JSON)
{"version":3,"sources":["../../src/next/index.ts","../../src/api.ts","../../src/types.ts"],"sourcesContent":["import type { NextApiRequest, NextApiResponse } from \"next\";\nimport { getSession, methodNotAllowed, notFound, signIn, signOut } from \"../api.js\";\n\nexport const siweApi = () => async (req: NextApiRequest, res: NextApiResponse) => {\n let { route } = req.query;\n if (route instanceof Array) route = route[0];\n const { method } = req;\n\n switch (route) {\n case undefined:\n switch (method) {\n case \"GET\":\n return getSession(req, res);\n default:\n return methodNotAllowed(req, res);\n }\n\n case \"signin\":\n switch (method) {\n case \"POST\":\n return signIn(req, res);\n default:\n return methodNotAllowed(req, res);\n }\n\n case \"signout\":\n switch (method) {\n case \"POST\":\n return signOut(req, res);\n default:\n return methodNotAllowed(req, res);\n }\n\n default:\n return notFound(req, res);\n }\n};\n","import type { IncomingMessage, ServerResponse } from 'http';\nimport { generateNonce, SiweMessage } from 'siwe';\nimport { fromZodError } from 'zod-validation-error';\nimport { GetSessionResponse, signInRequestSchema, SignInResponse, SignOutResponse } from './types.js';\n\ninterface Request extends IncomingMessage {\n body: any;\n}\n\ninterface Response<T = any> extends ServerResponse {\n json: (body: T) => void;\n send: (body: T) => void;\n status: (statusCode: number) => Response;\n}\n\ntype RequestHandler<T = any> = (req: Request, res: Response<T>) => void;\n\nexport const getSession: RequestHandler<GetSessionResponse> = async (req, res) => {\n if (req.session.address) {\n return res.json({\n authenticated: true,\n address: req.session.address,\n });\n }\n\n if (!req.session.nonce) {\n req.session.nonce = generateNonce();\n await req.session.save();\n }\n\n return res.json({\n authenticated: false,\n nonce: req.session.nonce,\n });\n};\n\nexport const signIn: RequestHandler<SignInResponse> = async (req, res) => {\n const { nonce } = req.session;\n if (!nonce) return res.status(400).send(\"Bad Request\");\n\n const parsedBody = signInRequestSchema.safeParse(req.body);\n if (!parsedBody.success) {\n const error = fromZodError(parsedBody.error);\n return res.status(400).send(error.message);\n }\n const { message, signature } = parsedBody.data;\n\n const { success, error, data } = await new SiweMessage(message).verify({\n signature,\n nonce,\n // domain, // TODO: verify domain is correct too\n });\n\n if (!success && error) return res.status(400).send(error.type);\n if (!success) return res.status(500).send(\"Unknown Error\");\n\n req.session.nonce = undefined;\n req.session.address = data.address;\n await req.session.save();\n\n return res.send(\"OK\");\n};\n\nexport const signOut: RequestHandler<SignOutResponse> = async (req, res) => {\n if (!req.session.address) return res.status(400).send(\"Bad Request\");\n\n req.session.nonce = generateNonce();\n req.session.address = undefined;\n await req.session.save();\n\n return res.send(\"OK\");\n};\n\nexport const methodNotAllowed: RequestHandler = (_req, res) =>\n res.status(403).send(\"Method Not Allowed\");\n\nexport const notFound: RequestHandler = (_req, res) =>\n res.status(404).send(\"Not Found\");\n","import \"iron-session\";\nimport { z } from \"zod\";\n\ndeclare module \"iron-session\" {\n interface IronSessionData {\n address?: string | undefined;\n nonce?: string | undefined;\n }\n}\n\nconst siweMessageSchema = z.object({\n domain: z.string(),\n address: z.string(),\n statement: z.string().optional(),\n uri: z.string(),\n version: z.string(),\n chainId: z.number(),\n nonce: z.string(),\n issuedAt: z.string().optional(),\n expirationTime: z.string().optional(),\n notBefore: z.string().optional(),\n requestId: z.string().optional(),\n resources: z.array(z.string()).optional(),\n});\n\nexport const signInRequestSchema = z.object({\n message: siweMessageSchema,\n signature: z.string(),\n});\n\nexport type GetSessionResponse = {\n authenticated: boolean,\n address?: string,\n nonce?: string\n};\n\nexport type SignInRequest = z.infer<typeof signInRequestSchema>;\n\nexport type SignInResponse = string;\n\nexport type SignOutResponse = string;\n\nexport type UseSiweOptions = {\n baseUrl?: string,\n};\n"],"mappings":"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","names":["next_exports","__export","siweApi","__toCommonJS","import_siwe","import_zod_validation_error","import_iron_session","import_zod","siweMessageSchema","signInRequestSchema","getSession","req","res","signIn","nonce","parsedBody","signInRequestSchema","error","message","signature","success","data","signOut","methodNotAllowed","_req","notFound","siweApi","req","res","route","method","getSession","methodNotAllowed","signIn","signOut","notFound"]}