@authaction/passkey-plus-sdk
Version:
A lightweight frontend SDK for passkey-based passwordless authentication with AuthAction
1 lines • 5.65 kB
Source Map (JSON)
{"version":3,"sources":["../src/passkey-plus.ts"],"sourcesContent":["import {\n IPasskeyAuthenticateOptions,\n IPasskeyCreationOptions,\n PasskeyPlusOptions,\n} from \"./types\";\nimport {\n startRegistration,\n startAuthentication,\n} from \"@simplewebauthn/browser\";\n\nexport class PasskeyPlus {\n private baseUrl: string;\n\n constructor(options: PasskeyPlusOptions) {\n const { tenantDomain, appId } = options;\n this.baseUrl = `https://${tenantDomain}/api/v1/passkey-plus-public/${appId}`;\n }\n\n async register(\n transactionID: string,\n opts?: IPasskeyCreationOptions\n ): Promise<string> {\n const publicKey = await this.getRegistrationOptions(transactionID);\n\n if (opts?.authenticatorAttachment) {\n publicKey.authenticatorSelection = {\n ...publicKey.authenticatorSelection,\n authenticatorAttachment: opts.authenticatorAttachment,\n };\n }\n\n const attestationResponse = await startRegistration({\n optionsJSON: publicKey,\n });\n\n const res = await fetch(\n `${this.baseUrl}/transaction/${transactionID}/register`,\n {\n method: \"POST\",\n headers: { \"Content-Type\": \"application/json\" },\n body: JSON.stringify(attestationResponse),\n }\n );\n\n const responseJson = await res.json();\n const { nonce } = responseJson.data;\n return nonce;\n }\n\n async authenticate(\n transactionId: string,\n opts?: IPasskeyAuthenticateOptions\n ): Promise<string> {\n const publicKey = await this.getAuthenticationOptions(transactionId);\n\n const assertionResponse = await startAuthentication({\n optionsJSON: publicKey,\n });\n\n const res = await fetch(\n `${this.baseUrl}/transaction/${transactionId}/authenticate`,\n {\n method: \"POST\",\n headers: { \"Content-Type\": \"application/json\" },\n body: JSON.stringify(assertionResponse),\n }\n );\n\n if (!res.ok) {\n const error = await res.json();\n throw new Error(\n `Authentication request failed: ${error.message || res.statusText}`\n );\n }\n\n const responseJson = await res.json();\n const { nonce } = responseJson.data;\n return nonce;\n }\n\n async canAuthenticateWithPasskey(): Promise<boolean> {\n return !!window.PublicKeyCredential;\n }\n\n async canRegisterPasskey(): Promise<boolean> {\n return (\n !!window.PublicKeyCredential &&\n typeof navigator.credentials.create === \"function\"\n );\n }\n\n async canUseConditionalMediation(): Promise<boolean> {\n return typeof window?.PublicKeyCredential\n ?.isConditionalMediationAvailable === \"function\"\n ? await window.PublicKeyCredential.isConditionalMediationAvailable()\n : false;\n }\n\n private async getRegistrationOptions(transactionID: string) {\n const res = await fetch(\n `${this.baseUrl}/transaction/${transactionID}/registration-options`\n );\n\n if (!res.ok) {\n const error = await res.json();\n throw new Error(\n `Registration options request failed: ${error.message || res.statusText}`\n );\n }\n\n const responseJson = await res.json();\n return responseJson.data;\n }\n\n private async getAuthenticationOptions(transactionID: string) {\n const res = await fetch(\n `${this.baseUrl}/transaction/${transactionID}/authentication-options`\n );\n\n if (!res.ok) {\n const error = await res.json();\n throw new Error(\n `Authentication options request failed: ${error.message || res.statusText}`\n );\n }\n\n const responseJson = await res.json();\n return responseJson.data;\n }\n}\n"],"mappings":"AAKA,OACE,qBAAAA,EACA,uBAAAC,MACK,0BAEA,IAAMC,EAAN,KAAkB,CAGvB,YAAYC,EAA6B,CACvC,GAAM,CAAE,aAAAC,EAAc,MAAAC,CAAM,EAAIF,EAChC,KAAK,QAAU,WAAWC,CAAY,+BAA+BC,CAAK,EAC5E,CAEA,MAAM,SACJC,EACAC,EACiB,CACjB,IAAMC,EAAY,MAAM,KAAK,uBAAuBF,CAAa,EAE7DC,GAAM,0BACRC,EAAU,uBAAyB,CACjC,GAAGA,EAAU,uBACb,wBAAyBD,EAAK,uBAChC,GAGF,IAAME,EAAsB,MAAMT,EAAkB,CAClD,YAAaQ,CACf,CAAC,EAWKE,EAAe,MATT,MAAM,MAChB,GAAG,KAAK,OAAO,gBAAgBJ,CAAa,YAC5C,CACE,OAAQ,OACR,QAAS,CAAE,eAAgB,kBAAmB,EAC9C,KAAM,KAAK,UAAUG,CAAmB,CAC1C,CACF,GAE+B,KAAK,EAC9B,CAAE,MAAAE,CAAM,EAAID,EAAa,KAC/B,OAAOC,CACT,CAEA,MAAM,aACJC,EACAL,EACiB,CACjB,IAAMC,EAAY,MAAM,KAAK,yBAAyBI,CAAa,EAE7DC,EAAoB,MAAMZ,EAAoB,CAClD,YAAaO,CACf,CAAC,EAEKM,EAAM,MAAM,MAChB,GAAG,KAAK,OAAO,gBAAgBF,CAAa,gBAC5C,CACE,OAAQ,OACR,QAAS,CAAE,eAAgB,kBAAmB,EAC9C,KAAM,KAAK,UAAUC,CAAiB,CACxC,CACF,EAEA,GAAI,CAACC,EAAI,GAAI,CACX,IAAMC,EAAQ,MAAMD,EAAI,KAAK,EAC7B,MAAM,IAAI,MACR,kCAAkCC,EAAM,SAAWD,EAAI,UAAU,EACnE,CACF,CAEA,IAAMJ,EAAe,MAAMI,EAAI,KAAK,EAC9B,CAAE,MAAAH,CAAM,EAAID,EAAa,KAC/B,OAAOC,CACT,CAEA,MAAM,4BAA+C,CACnD,MAAO,CAAC,CAAC,OAAO,mBAClB,CAEA,MAAM,oBAAuC,CAC3C,MACE,CAAC,CAAC,OAAO,qBACT,OAAO,UAAU,YAAY,QAAW,UAE5C,CAEA,MAAM,4BAA+C,CACnD,OAAO,OAAO,QAAQ,qBAClB,iCAAoC,WACpC,MAAM,OAAO,oBAAoB,gCAAgC,EACjE,EACN,CAEA,MAAc,uBAAuBL,EAAuB,CAC1D,IAAMQ,EAAM,MAAM,MAChB,GAAG,KAAK,OAAO,gBAAgBR,CAAa,uBAC9C,EAEA,GAAI,CAACQ,EAAI,GAAI,CACX,IAAMC,EAAQ,MAAMD,EAAI,KAAK,EAC7B,MAAM,IAAI,MACR,wCAAwCC,EAAM,SAAWD,EAAI,UAAU,EACzE,CACF,CAGA,OADqB,MAAMA,EAAI,KAAK,GAChB,IACtB,CAEA,MAAc,yBAAyBR,EAAuB,CAC5D,IAAMQ,EAAM,MAAM,MAChB,GAAG,KAAK,OAAO,gBAAgBR,CAAa,yBAC9C,EAEA,GAAI,CAACQ,EAAI,GAAI,CACX,IAAMC,EAAQ,MAAMD,EAAI,KAAK,EAC7B,MAAM,IAAI,MACR,0CAA0CC,EAAM,SAAWD,EAAI,UAAU,EAC3E,CACF,CAGA,OADqB,MAAMA,EAAI,KAAK,GAChB,IACtB,CACF","names":["startRegistration","startAuthentication","PasskeyPlus","options","tenantDomain","appId","transactionID","opts","publicKey","attestationResponse","responseJson","nonce","transactionId","assertionResponse","res","error"]}