@randombits/use-siwe
Version:
React hook and API endpoints that provide Sign In With Ethereum support
2 lines • 1.66 kB
JavaScript
import h from"express";import{generateNonce as u,SiweMessage as x}from"siwe";import{fromZodError as I}from"zod-validation-error";import"iron-session";import{z as s}from"zod";var S=s.object({domain:s.string(),address:s.string(),statement:s.string().optional(),uri:s.string(),version:s.string(),chainId:s.number(),nonce:s.string(),issuedAt:s.string().optional(),expirationTime:s.string().optional(),notBefore:s.string().optional(),requestId:s.string().optional(),resources:s.array(s.string()).optional()}),d=s.object({message:S,signature:s.string()});var p=async(e,n)=>e.session.address?n.json({authenticated:!0,address:e.session.address}):(e.session.nonce||(e.session.nonce=u(),await e.session.save()),n.json({authenticated:!1,nonce:e.session.nonce})),g=async(e,n)=>{let{nonce:r}=e.session;if(!r)return n.status(400).send("Bad Request");let o=d.safeParse(e.body);if(!o.success){let y=I(o.error);return n.status(400).send(y.message)}let{message:l,signature:R}=o.data,{success:i,error:a,data:f}=await new x(l).verify({signature:R,nonce:r});return!i&&a?n.status(400).send(a.type):i?(e.session.nonce=void 0,e.session.address=f.address,await e.session.save(),n.send("OK")):n.status(500).send("Unknown Error")},c=async(e,n)=>e.session.address?(e.session.nonce=u(),e.session.address=void 0,await e.session.save(),n.send("OK")):n.status(400).send("Bad Request"),t=(e,n)=>n.status(403).send("Method Not Allowed"),m=(e,n)=>n.status(404).send("Not Found");var F=()=>{let e=h.Router();return e.route("/").get(p).all(t),e.route("/signin").post(g).all(t),e.route("/signout").post(c).all(t),e.route("*").all(m),e};export{F as authRouter};
//# sourceMappingURL=index.js.map