@seamless-auth/react-native 0.3.0 → 0.3.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/CHANGELOG.md CHANGED
@@ -1,5 +1,29 @@
1
1
  # @seamless-auth/react-native
2
2
 
3
+ ## 0.3.2
4
+
5
+ ### Patch Changes
6
+
7
+ - 782583c: In bearer transport, a request that carries a token no longer follows a redirect to an origin outside `apiHost` and `trustedOrigins`. The client asks `fetch` for `redirect: 'manual'`, follows a redirect to a trusted origin itself (up to five hops, turning a `303`, or a `301` or `302` after a POST, into a GET as `fetch` does), and rejects any other with the new `UntrustedRedirectError` without sending the token on. Where the platform follows redirects regardless, as React Native's `fetch` does, a response that ended on another origin is rejected instead. A caller that sets `redirect` itself keeps that choice, and the final-origin check still applies. Requests without a token, and cookie transport, are unchanged.
8
+ - Updated dependencies [782583c]
9
+ - Updated dependencies [e3cf1f9]
10
+ - @seamless-auth/client@0.7.0
11
+
12
+ ## 0.3.1
13
+
14
+ ### Patch Changes
15
+
16
+ - 59802e2: Add a confirmation step for magic links opened on another device.
17
+
18
+ A magic link opened on a device other than the one that asked for it now waits for the reader to approve it (auth API 0.19.0 and later). The bundled verify screens show which kind of device asked and when, and offer "Yes, sign in that device" or "No, this wasn't me". Approving signs in the requesting device and tells the reader to return to it; declining changes nothing.
19
+
20
+ `@seamless-auth/client` adds `client.confirmMagicLink(token)`, the `getMagicLinkConfirmation`, `isMagicLinkConfirmationRequired`, `describeMagicLinkDevice`, `magicLinkConfirmationPrompt` and `confirmMagicLinkSignIn` helpers, and the `MagicLinkConfirmation` and `MagicLinkDeviceClass` types. In bearer mode the verify call now sends the sign-in's ephemeral token when one is held. A custom verify screen that treats every failure as an invalid link should check `getMagicLinkConfirmation(error)` first.
21
+
22
+ The React Native README describes the new step for apps that handle magic links.
23
+
24
+ - Updated dependencies [59802e2]
25
+ - @seamless-auth/client@0.6.0
26
+
3
27
  ## 0.3.0
4
28
 
5
29
  ### Minor Changes
package/README.md CHANGED
@@ -99,7 +99,8 @@ token and refreshes it once on a 401; a path resolves on `apiHost`, and a path
99
99
  under the adapter's mount (`/auth/sessions`) is sent as an adapter call. The
100
100
  token goes only to `apiHost` and the origins in the provider's `trustedOrigins`
101
101
  prop; any other origin rejects with `UntrustedOriginError` before anything is
102
- sent:
102
+ sent. A response that a redirect took to any other origin rejects with
103
+ `UntrustedRedirectError`, and the client never follows such a redirect itself:
103
104
 
104
105
  ```ts
105
106
  const authorizedFetch = useAuthorizedFetch();
@@ -132,9 +133,18 @@ rather than a user agent.
132
133
 
133
134
  Request one with `client.requestMagicLink()`, then poll
134
135
  `client.checkMagicLink()` every few seconds; the poll returns the session once
135
- the link has been opened anywhere. If the app also receives the link as a
136
- universal link, call `client.verifyMagicLink(token)` and then
137
- `checkMagicLink()`.
136
+ the link has been used. If the app also receives the link as a universal link,
137
+ call `client.verifyMagicLink(token)` and then `checkMagicLink()`. Bearer mode
138
+ sends the sign-in's ephemeral token with the verify call, which is how the API
139
+ knows this is the device that asked for the link.
140
+
141
+ Opened on any other device, the link is not used until someone there approves
142
+ it: `verifyMagicLink` fails with an error `getMagicLinkConfirmation(error)`
143
+ recognises, carrying the requesting device's platform and request time
144
+ (`magicLinkConfirmationPrompt(held)` phrases both). If the app handles links it
145
+ did not ask for, show that and call `confirmMagicLinkSignIn({ client, token })`
146
+ only when the person agrees. The requesting device is then signed in by its
147
+ poll, and this one is not.
138
148
 
139
149
  ### OAuth
140
150
 
package/dist/index.d.ts CHANGED
@@ -12,5 +12,5 @@ export { createSecureStoreTokenStorage } from './ports/secureStoreTokenStorage';
12
12
  export type { SecureStoreLike, SecureStoreTokenStorageOptions, } from './ports/secureStoreTokenStorage';
13
13
  export { createWebBrowserOAuthRedirect, parseOAuthCallbackUrl, } from './ports/webBrowserOAuthRedirect';
14
14
  export type { WebBrowserLike } from './ports/webBrowserOAuthRedirect';
15
- export { createSeamlessAuthClient, encodePrfSalt, extractPasskeyPrfResult, getOAuthErrorCode, getPasskeyPolicyErrorCode, getWebAuthnErrorDetail, hasScopedRole, isUnauthenticated, PasskeyCeremonyError, roleGrantsAccess, SeamlessAuthError, UntrustedOriginError, } from '@seamless-auth/client';
15
+ export { createSeamlessAuthClient, encodePrfSalt, extractPasskeyPrfResult, getOAuthErrorCode, getPasskeyPolicyErrorCode, getWebAuthnErrorDetail, hasScopedRole, isUnauthenticated, PasskeyCeremonyError, roleGrantsAccess, SeamlessAuthError, UntrustedOriginError, UntrustedRedirectError, } from '@seamless-auth/client';
16
16
  export type { Credential, CredentialUpdateResult, CurrentUserResult, FinishOAuthLoginInput, FinishOAuthLoginResult, LoginInput, LoginMethod, LoginStartResult, MessageResult, OAuthErrorCode, OAuthProvider, OAuthProvidersResult, OAuthRedirectOutcome, OAuthRedirectPort, Organization, OrganizationMembership, OrganizationSwitchResult, PasskeyAttachment, PasskeyLoginData, PasskeyMetadata, PasskeyPolicyErrorCode, PasskeyPort, PasskeyPrfInput, PasskeyPrfResult, PasskeyRegistrationData, PublicSystemConfigResult, RegisterInput, RegisterPasskeyOptions, SeamlessAuthClient, SeamlessAuthClientOptions, SeamlessAuthResult, StartOAuthLoginInput, StartOAuthLoginResult, StepUpMethod, StepUpPrfData, StepUpStatus, StoredTokens, TokenStoragePort, TotpEnrollmentStartResult, TotpStatus, User, WebAuthnErrorDetail, } from '@seamless-auth/client';
package/dist/index.js CHANGED
@@ -1,2 +1,2 @@
1
- import{jsx as e}from"react/jsx-runtime";import{createAuthSession as t,createMemoryTokenStorage as r,loadLoginMethods as s,detectPasskeySupport as n,PasskeyCeremonyError as o}from"@seamless-auth/client";export{FALLBACK_LOGIN_METHODS,PasskeyCeremonyError,SeamlessAuthError,UntrustedOriginError,createSeamlessAuthClient,encodePrfSalt,extractPasskeyPrfResult,getOAuthErrorCode,getPasskeyPolicyErrorCode,getWebAuthnErrorDetail,hasNonPasskeyLoginMethod,hasScopedRole,isUnauthenticated,roleGrantsAccess}from"@seamless-auth/client";import{createContext as a,useContext as i,useMemo as c,useSyncExternalStore as l,useEffect as u,useState as d}from"react";const h=a(void 0),y=()=>{const e=i(h);if(!e)throw new Error("useAuth must be used within an AuthProvider");return e},p=({children:s,apiHost:n,basePath:o,magicLinkRedirectUri:a,ports:i,fetch:d,trustedOrigins:y})=>{const{passkeys:p,oauthRedirect:f,tokenStorage:g}=i,m=y?JSON.stringify(y):void 0,k=c(()=>t({apiHost:n,magicLinkRedirectUri:a,passkeys:p,transport:{mode:"bearer",basePath:o,tokenStorage:g??r(),fetch:d,trustedOrigins:m?JSON.parse(m):void 0},detectPreviousSignIn:!1}),[n,o,a,p,g,d,m]),S=l(k.subscribe,k.getState,k.getState);u(()=>{k.actions.refreshSession()},[k]);const w=c(()=>({...S,...k.actions,apiHost:n,magicLinkRedirectUri:a,client:k.client,ports:{passkeys:p,oauthRedirect:f,tokenStorage:g}}),[S,k,n,a,p,f,g]);return e(h.Provider,{value:w,children:s})};function f(e,t){const r="ios"===e.OS?"iOS":"android"===e.OS?"Android":e.OS;return{friendlyName:t??`${r} device`,platform:e.OS,browser:"native",deviceInfo:`${r} ${String(e.Version)}`}}const g=()=>y().client,m=()=>y().client.authorizedFetch,k=()=>{const e=g(),[t,r]=d(null),[n,o]=d(!0);return u(()=>{let t=!0;return s(e).then(e=>{t&&(e&&r(e),o(!1))}),()=>{t=!1}},[e]),{loginMethods:t,loading:n}},S=()=>{const{ports:e}=y(),[t,r]=d(!1),[s,o]=d(!0);return u(()=>{let t=!0;return n(e.passkeys).then(e=>{t&&(r(e),o(!1))}),()=>{t=!1}},[e.passkeys]),{passkeySupported:t,loading:s}};function w(e){const t=e,r="string"==typeof t?.code?t.code:void 0,s="string"==typeof t?.name?t.name:"UnknownError",n="string"==typeof t?.message?t.message:"Passkey ceremony failed.",a=/cancel|abort|dismiss|NotAllowed|UserCancelled|1001/i.test(`${s} ${r??""} ${n}`)?"NotAllowedError":/InvalidState|exists|excluded|already/i.test(`${s} ${r??""} ${n}`)?"InvalidStateError":s;return new o(a,n,r??a,e)}function A(e){return{isSupported:()=>e.isSupported(),isPlatformAuthenticatorAvailable:async()=>e.isSupported(),async create(t){let r;try{r=await e.create(t)}catch(e){throw w(e)}if(!r)throw new o("NotAllowedError","Passkey registration was cancelled.");return r},async get(t){let r;try{r=await e.get(t)}catch(e){throw w(e)}if(!r)throw new o("NotAllowedError","Passkey sign-in was cancelled.");return r}}}function O(e,t={}){const r=t.key??"seamless-auth.session";return{async get(){try{const s=await e.getItemAsync(r,t.storeOptions);if(!s)return null;const n=JSON.parse(s);if(n&&"object"==typeof n&&"string"==typeof n.accessToken&&"string"==typeof n.refreshToken){const{accessToken:e,refreshToken:t}=n;return{accessToken:e,refreshToken:t}}return null}catch{return null}},async set(s){try{await e.setItemAsync(r,JSON.stringify({accessToken:s.accessToken,refreshToken:s.refreshToken}),t.storeOptions)}catch{}},async remove(){try{await e.deleteItemAsync(r,t.storeOptions)}catch{}}}}function P(e){let t;try{t=new URL(e).searchParams}catch{const r=e.split("?")[1];if(!r)return null;t=new URLSearchParams(r.split("#")[0])}const r=t.get("code"),s=t.get("state");return r&&s?{code:r,state:s}:null}function v(e,t){return{async open(r,s){const n=await e.openAuthSessionAsync(r,s,t);if("success"!==n.type||!n.url)return{type:"cancelled"};const o=P(n.url);return o?{type:"callback",...o}:{type:"cancelled"}}}}export{p as AuthProvider,A as createNativePasskeyPort,O as createSecureStoreTokenStorage,v as createWebBrowserOAuthRedirect,f as describeDevice,P as parseOAuthCallbackUrl,y as useAuth,g as useAuthClient,m as useAuthorizedFetch,k as useLoginMethods,S as usePasskeySupport};
1
+ import{jsx as e}from"react/jsx-runtime";import{createAuthSession as t,createMemoryTokenStorage as r,loadLoginMethods as s,detectPasskeySupport as n,PasskeyCeremonyError as o}from"@seamless-auth/client";export{FALLBACK_LOGIN_METHODS,PasskeyCeremonyError,SeamlessAuthError,UntrustedOriginError,UntrustedRedirectError,createSeamlessAuthClient,encodePrfSalt,extractPasskeyPrfResult,getOAuthErrorCode,getPasskeyPolicyErrorCode,getWebAuthnErrorDetail,hasNonPasskeyLoginMethod,hasScopedRole,isUnauthenticated,roleGrantsAccess}from"@seamless-auth/client";import{createContext as a,useContext as i,useMemo as c,useSyncExternalStore as l,useEffect as u,useState as d}from"react";const h=a(void 0),y=()=>{const e=i(h);if(!e)throw new Error("useAuth must be used within an AuthProvider");return e},p=({children:s,apiHost:n,basePath:o,magicLinkRedirectUri:a,ports:i,fetch:d,trustedOrigins:y})=>{const{passkeys:p,oauthRedirect:f,tokenStorage:g}=i,m=y?JSON.stringify(y):void 0,k=c(()=>t({apiHost:n,magicLinkRedirectUri:a,passkeys:p,transport:{mode:"bearer",basePath:o,tokenStorage:g??r(),fetch:d,trustedOrigins:m?JSON.parse(m):void 0},detectPreviousSignIn:!1}),[n,o,a,p,g,d,m]),S=l(k.subscribe,k.getState,k.getState);u(()=>{k.actions.refreshSession()},[k]);const w=c(()=>({...S,...k.actions,apiHost:n,magicLinkRedirectUri:a,client:k.client,ports:{passkeys:p,oauthRedirect:f,tokenStorage:g}}),[S,k,n,a,p,f,g]);return e(h.Provider,{value:w,children:s})};function f(e,t){const r="ios"===e.OS?"iOS":"android"===e.OS?"Android":e.OS;return{friendlyName:t??`${r} device`,platform:e.OS,browser:"native",deviceInfo:`${r} ${String(e.Version)}`}}const g=()=>y().client,m=()=>y().client.authorizedFetch,k=()=>{const e=g(),[t,r]=d(null),[n,o]=d(!0);return u(()=>{let t=!0;return s(e).then(e=>{t&&(e&&r(e),o(!1))}),()=>{t=!1}},[e]),{loginMethods:t,loading:n}},S=()=>{const{ports:e}=y(),[t,r]=d(!1),[s,o]=d(!0);return u(()=>{let t=!0;return n(e.passkeys).then(e=>{t&&(r(e),o(!1))}),()=>{t=!1}},[e.passkeys]),{passkeySupported:t,loading:s}};function w(e){const t=e,r="string"==typeof t?.code?t.code:void 0,s="string"==typeof t?.name?t.name:"UnknownError",n="string"==typeof t?.message?t.message:"Passkey ceremony failed.",a=/cancel|abort|dismiss|NotAllowed|UserCancelled|1001/i.test(`${s} ${r??""} ${n}`)?"NotAllowedError":/InvalidState|exists|excluded|already/i.test(`${s} ${r??""} ${n}`)?"InvalidStateError":s;return new o(a,n,r??a,e)}function A(e){return{isSupported:()=>e.isSupported(),isPlatformAuthenticatorAvailable:async()=>e.isSupported(),async create(t){let r;try{r=await e.create(t)}catch(e){throw w(e)}if(!r)throw new o("NotAllowedError","Passkey registration was cancelled.");return r},async get(t){let r;try{r=await e.get(t)}catch(e){throw w(e)}if(!r)throw new o("NotAllowedError","Passkey sign-in was cancelled.");return r}}}function O(e,t={}){const r=t.key??"seamless-auth.session";return{async get(){try{const s=await e.getItemAsync(r,t.storeOptions);if(!s)return null;const n=JSON.parse(s);if(n&&"object"==typeof n&&"string"==typeof n.accessToken&&"string"==typeof n.refreshToken){const{accessToken:e,refreshToken:t}=n;return{accessToken:e,refreshToken:t}}return null}catch{return null}},async set(s){try{await e.setItemAsync(r,JSON.stringify({accessToken:s.accessToken,refreshToken:s.refreshToken}),t.storeOptions)}catch{}},async remove(){try{await e.deleteItemAsync(r,t.storeOptions)}catch{}}}}function P(e){let t;try{t=new URL(e).searchParams}catch{const r=e.split("?")[1];if(!r)return null;t=new URLSearchParams(r.split("#")[0])}const r=t.get("code"),s=t.get("state");return r&&s?{code:r,state:s}:null}function v(e,t){return{async open(r,s){const n=await e.openAuthSessionAsync(r,s,t);if("success"!==n.type||!n.url)return{type:"cancelled"};const o=P(n.url);return o?{type:"callback",...o}:{type:"cancelled"}}}}export{p as AuthProvider,A as createNativePasskeyPort,O as createSecureStoreTokenStorage,v as createWebBrowserOAuthRedirect,f as describeDevice,P as parseOAuthCallbackUrl,y as useAuth,g as useAuthClient,m as useAuthorizedFetch,k as useLoginMethods,S as usePasskeySupport};
2
2
  //# sourceMappingURL=index.js.map
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sources":["../src/AuthProvider.tsx","../src/deviceInfo.ts","../src/hooks/useAuthClient.ts","../src/hooks/useAuthorizedFetch.ts","../src/hooks/useLoginMethods.ts","../src/hooks/usePasskeySupport.ts","../src/ports/nativePasskeys.ts","../src/ports/secureStoreTokenStorage.ts","../src/ports/webBrowserOAuthRedirect.ts"],"sourcesContent":[null,null,null,null,null,null,null,null,null],"names":["AuthContext","createContext","undefined","useAuth","context","useContext","Error","AuthProvider","children","apiHost","basePath","magicLinkRedirectUri","ports","fetch","fetchImpl","trustedOrigins","passkeys","oauthRedirect","tokenStorage","trustedOriginsKey","JSON","stringify","session","useMemo","createAuthSession","transport","mode","createMemoryTokenStorage","parse","detectPreviousSignIn","state","useSyncExternalStore","subscribe","getState","useEffect","actions","refreshSession","value","client","_jsx","Provider","describeDevice","platform","friendlyName","os","OS","browser","deviceInfo","String","Version","useAuthClient","useAuthorizedFetch","authorizedFetch","useLoginMethods","authClient","loginMethods","setLoginMethods","useState","loading","setLoading","active","loadLoginMethods","then","methods","usePasskeySupport","passkeySupported","setPasskeySupported","detectPasskeySupport","supported","toCeremonyError","thrown","error","code","rawName","name","message","test","PasskeyCeremonyError","createNativePasskeyPort","native","isSupported","isPlatformAuthenticatorAvailable","async","create","optionsJSON","result","get","createSecureStoreTokenStorage","store","options","key","raw","getItemAsync","storeOptions","parsed","accessToken","refreshToken","set","tokens","setItemAsync","remove","deleteItemAsync","parseOAuthCallbackUrl","url","params","URL","searchParams","query","split","URLSearchParams","createWebBrowserOAuthRedirect","open","authorizationUrl","redirectUri","openAuthSessionAsync","type","callback"],"mappings":"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"}
1
+ {"version":3,"file":"index.js","sources":["../src/AuthProvider.tsx","../src/deviceInfo.ts","../src/hooks/useAuthClient.ts","../src/hooks/useAuthorizedFetch.ts","../src/hooks/useLoginMethods.ts","../src/hooks/usePasskeySupport.ts","../src/ports/nativePasskeys.ts","../src/ports/secureStoreTokenStorage.ts","../src/ports/webBrowserOAuthRedirect.ts"],"sourcesContent":[null,null,null,null,null,null,null,null,null],"names":["AuthContext","createContext","undefined","useAuth","context","useContext","Error","AuthProvider","children","apiHost","basePath","magicLinkRedirectUri","ports","fetch","fetchImpl","trustedOrigins","passkeys","oauthRedirect","tokenStorage","trustedOriginsKey","JSON","stringify","session","useMemo","createAuthSession","transport","mode","createMemoryTokenStorage","parse","detectPreviousSignIn","state","useSyncExternalStore","subscribe","getState","useEffect","actions","refreshSession","value","client","_jsx","Provider","describeDevice","platform","friendlyName","os","OS","browser","deviceInfo","String","Version","useAuthClient","useAuthorizedFetch","authorizedFetch","useLoginMethods","authClient","loginMethods","setLoginMethods","useState","loading","setLoading","active","loadLoginMethods","then","methods","usePasskeySupport","passkeySupported","setPasskeySupported","detectPasskeySupport","supported","toCeremonyError","thrown","error","code","rawName","name","message","test","PasskeyCeremonyError","createNativePasskeyPort","native","isSupported","isPlatformAuthenticatorAvailable","async","create","optionsJSON","result","get","createSecureStoreTokenStorage","store","options","key","raw","getItemAsync","storeOptions","parsed","accessToken","refreshToken","set","tokens","setItemAsync","remove","deleteItemAsync","parseOAuthCallbackUrl","url","params","URL","searchParams","query","split","URLSearchParams","createWebBrowserOAuthRedirect","open","authorizationUrl","redirectUri","openAuthSessionAsync","type","callback"],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@seamless-auth/react-native",
3
- "version": "0.3.0",
3
+ "version": "0.3.2",
4
4
  "description": "Headless React Native binding for Seamless Auth: provider, hooks, and the native ports for passkeys, secure token storage, and in-app browser OAuth.",
5
5
  "type": "module",
6
6
  "exports": {
@@ -45,7 +45,7 @@
45
45
  "react": "^18.0.0 || ^19.0.0"
46
46
  },
47
47
  "dependencies": {
48
- "@seamless-auth/client": "^0.5.0",
48
+ "@seamless-auth/client": "^0.7.0",
49
49
  "@seamless-auth/types": "^0.28.0"
50
50
  },
51
51
  "sideEffects": false