{"version":3,"file":"passwordless.iife.js","sources":["../src/passwordless.ts"],"sourcesContent":["import { AtLeast, RegisterBeginResponse, RegisterCompleteResponse, SigninBeginResponse, SigninCompleteResponse, SigninMethod } from './types';\r\n\r\nexport interface Config {\r\n apiUrl: string;\r\n apiKey: string;\r\n origin: string;\r\n rpid: string;\r\n}\r\n\r\nexport class Client {\r\n private config: Config = {\r\n apiUrl: 'https://apiv2.passwordless.dev',\r\n apiKey: '',\r\n origin: window.location.origin,\r\n rpid: window.location.hostname,\r\n }\r\n\r\n constructor(config: AtLeast) {\r\n Object.assign(this.config, config);\r\n }\r\n\r\n /**\r\n * Register a new credential to a user\r\n * \r\n * @param {string} token Token generated by your backend and the Passwordless API\r\n */\r\n public async register(token: string, credentialNickname: string): Promise {\r\n this.assertBrowserSupported();\r\n\r\n try {\r\n const registration = await this.registerBegin(token);\r\n\r\n registration.data.challenge = this.coerceToArrayBuffer(registration.data.challenge);\r\n registration.data.user.id = this.coerceToArrayBuffer(registration.data.user.id);\r\n registration.data.excludeCredentials?.forEach((cred) => {\r\n cred.id = this.coerceToArrayBuffer(cred.id);\r\n });\r\n\r\n const credential = await navigator.credentials.create({\r\n publicKey: registration.data,\r\n }) as PublicKeyCredential;\r\n\r\n if (!credential) {\r\n throw new Error('Failed to create credential (navigator.credentials.create)');\r\n }\r\n\r\n await this.registerComplete(credential, registration.sessionId, credentialNickname);\r\n } catch (error) {\r\n console.error(error);\r\n throw new Error(`Passwordless register failed: ${error.message}`);\r\n }\r\n }\r\n\r\n private async registerBegin(token: string): Promise {\r\n const response = await fetch(`${this.config.apiUrl}/register/begin`, {\r\n method: 'POST',\r\n headers: this.createHeaders(),\r\n body: JSON.stringify({\r\n token,\r\n RPID: this.config.rpid,\r\n Origin: this.config.origin,\r\n }),\r\n });\r\n\r\n return response.json();\r\n }\r\n\r\n private async registerComplete(\r\n credential: PublicKeyCredential,\r\n sessionId: string,\r\n credentialNickname: string,\r\n ): Promise {\r\n const attestationResponse = credential.response as AuthenticatorAttestationResponse;\r\n\r\n const response = await fetch(`${this.config.apiUrl}/register/complete`, {\r\n method: 'POST',\r\n headers: this.createHeaders(),\r\n body: JSON.stringify({\r\n sessionId,\r\n response: {\r\n id: credential.id,\r\n rawId: this.coerceToBase64Url(new Uint8Array(credential.rawId)),\r\n type: credential.type,\r\n extensions: credential.getClientExtensionResults(),\r\n response: {\r\n AttestationObject: this.coerceToBase64Url(\r\n new Uint8Array(attestationResponse.attestationObject),\r\n ),\r\n clientDataJson: this.coerceToBase64Url(\r\n new Uint8Array(attestationResponse.clientDataJSON),\r\n ),\r\n },\r\n },\r\n nickname: credentialNickname,\r\n RPID: this.config.rpid,\r\n Origin: this.config.origin,\r\n }),\r\n });\r\n\r\n return response.json();\r\n }\r\n\r\n /**\r\n * Sign in a user using the userid\r\n * @param {string} userId \r\n * @returns \r\n */\r\n public async signinWithId(userId: string): Promise {\r\n return this.signin({userId})\r\n }\r\n\r\n /**\r\n * Sign in a user using an alias\r\n * @param {string} alias \r\n * @returns \r\n */\r\n public async signinWithAlias(alias: string): Promise {\r\n return this.signin({alias})\r\n }\r\n\r\n /**\r\n * Sign in a user\r\n *\r\n * @param {SigninMethod} Object containing either UserID or Alias\r\n * @returns\r\n */\r\n private async signin(signinMethod: SigninMethod): Promise {\r\n this.assertBrowserSupported();\r\n\r\n try {\r\n const signin = await this.signinBegin(signinMethod);\r\n\r\n signin.data.challenge = this.coerceToArrayBuffer(signin.data.challenge);\r\n signin.data.allowCredentials?.forEach((cred) => {\r\n cred.id = this.coerceToArrayBuffer(cred.id);\r\n });\r\n\r\n const credential = await navigator.credentials.get({\r\n publicKey: signin.data,\r\n }) as PublicKeyCredential;\r\n\r\n const response = await this.signinComplete(credential, signin.sessionId);\r\n console.log(response);\r\n return response.data;\r\n } catch (error) {\r\n console.error(error);\r\n throw new Error(`Passwordless signin failed: ${error.message}`);\r\n }\r\n }\r\n\r\n private async signinBegin(signinMethod: SigninMethod): Promise {\r\n const response = await fetch(`${this.config.apiUrl}/signin/begin`, {\r\n method: 'POST',\r\n headers: this.createHeaders(),\r\n body: JSON.stringify({\r\n userId: \"userId\" in signinMethod ? signinMethod.userId : undefined,\r\n alias: \"alias\" in signinMethod ? signinMethod.alias : undefined,\r\n RPID: this.config.rpid,\r\n Origin: this.config.origin,\r\n }),\r\n });\r\n\r\n return response.json();\r\n }\r\n\r\n private async signinComplete(\r\n credential: PublicKeyCredential,\r\n sessionId: string,\r\n ): Promise {\r\n const assertionResponse = credential.response as AuthenticatorAssertionResponse;\r\n\r\n const response = await fetch(`${this.config.apiUrl}/signin/complete`, {\r\n method: 'POST',\r\n headers: this.createHeaders(),\r\n body: JSON.stringify({\r\n sessionId,\r\n response: {\r\n id: credential.id,\r\n rawId: this.coerceToBase64Url(new Uint8Array(credential.rawId)),\r\n type: credential.type,\r\n extensions: credential.getClientExtensionResults(),\r\n response: {\r\n authenticatorData: this.coerceToBase64Url(\r\n new Uint8Array(assertionResponse.authenticatorData),\r\n ),\r\n clientDataJson: this.coerceToBase64Url(\r\n new Uint8Array(assertionResponse.clientDataJSON),\r\n ),\r\n signature: this.coerceToBase64Url(\r\n new Uint8Array(assertionResponse.signature),\r\n ),\r\n },\r\n },\r\n RPID: this.config.rpid,\r\n Origin: this.config.origin,\r\n }),\r\n });\r\n\r\n return response.json();\r\n }\r\n\r\n private assertBrowserSupported(): void {\r\n if (!isBrowserSupported()) {\r\n throw new Error('WebAuthn and PublicKeyCredentials are not supported on this browser/device');\r\n }\r\n }\r\n\r\n private createHeaders(): Record {\r\n return {\r\n ApiKey: this.config.apiKey,\r\n 'Content-Type': 'application/json',\r\n };\r\n }\r\n\r\n private coerceToArrayBuffer(value: unknown): ArrayBuffer {\r\n if (typeof value === 'string') {\r\n const base64 = this.base64UrlToBase64(value);\r\n const string = atob(base64);\r\n const bytes = new Uint8Array(string.length);\r\n for (let i = 0; i < string.length; i++) {\r\n bytes[i] = string.charCodeAt(i);\r\n }\r\n\r\n return bytes;\r\n }\r\n\r\n console.warn('Could not coerce to string:', value);\r\n throw new TypeError('Could not coerce to ArrayBuffer');\r\n }\r\n\r\n private coerceToBase64Url(value: unknown): string {\r\n const uint8Array = (() => {\r\n if (Array.isArray(value)) return Uint8Array.from(value);\r\n if (value instanceof ArrayBuffer) return new Uint8Array(value);\r\n if (value instanceof Uint8Array) return value;\r\n console.warn('Could not coerce to string:', value);\r\n throw new Error('Could not coerce to string');\r\n })();\r\n \r\n let string = '';\r\n for (let i = 0; i < uint8Array.byteLength; i++) {\r\n string += String.fromCharCode(uint8Array[i]);\r\n }\r\n\r\n const base64String = btoa(string);\r\n return this.base64ToBase64Url(base64String);\r\n }\r\n\r\n private base64ToBase64Url(base64: string): string {\r\n return base64.replace(/\\+/g, '-').replace(/\\//g, '_').replace(/=*$/g, '');\r\n }\r\n\r\n private base64UrlToBase64(base64Url: string): string {\r\n return base64Url.replace(/-/g, '+').replace(/_/g, '/');\r\n }\r\n}\r\n\r\nexport async function isPlatformSupported(): Promise {\r\n if (!isBrowserSupported()) return false;\r\n return PublicKeyCredential.isUserVerifyingPlatformAuthenticatorAvailable();\r\n}\r\n\r\nexport function isBrowserSupported(): boolean {\r\n return window.PublicKeyCredential !== undefined && typeof window.PublicKeyCredential === 'function';\r\n}\r\n"],"names":[],"mappings":"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"}