UNPKG

@randombits/use-siwe

Version:

React hook and API endpoints that provide Sign In With Ethereum support

1 lines 6.54 kB
{"version":3,"sources":["../../src/express/index.ts","../../src/api.ts","../../src/types.ts"],"sourcesContent":["import express from \"express\";\nimport { getSession, methodNotAllowed, notFound, signIn, signOut } from \"../api.js\";\n\nexport const authRouter = () => {\n const router = express.Router();\n\n router.route('/')\n .get(getSession)\n .all(methodNotAllowed);\n\n router.route('/signin')\n .post(signIn)\n .all(methodNotAllowed);\n\n router.route('/signout')\n .post(signOut)\n .all(methodNotAllowed);\n\n router.route('*')\n .all(notFound);\n\n return router;\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":["express_exports","__export","authRouter","__toCommonJS","import_express","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","authRouter","router","express","getSession","methodNotAllowed","signIn","signOut","notFound"]}