@seamless-auth/react-native 0.2.3 → 0.3.0

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,16 @@
1
1
  # @seamless-auth/react-native
2
2
 
3
+ ## 0.3.0
4
+
5
+ ### Minor Changes
6
+
7
+ - d1e3310: `authorizedFetch` (and `useAuthorizedFetch`) now sends the session only to `apiHost` and to origins you list in the new `trustedOrigins` option. A request to any other origin rejects with `UntrustedOriginError` and is never sent, so the session cookies, or in React Native the access token, cannot reach a third party through it. Paths, and full URLs on `apiHost`, work as before; a relative URL that does not start with `/` is now refused, and each `trustedOrigins` entry must be a bare `https` origin (`http` only on localhost). If your own API is served from a different origin than the auth adapter, add that origin: `transport: { trustedOrigins: ['https://api.example.com'] }` on the React `AuthProvider`, the `trustedOrigins` prop on the React Native `AuthProvider`, or `trustedOrigins` in `provideSeamlessAuth`, which `seamlessAuthInterceptor` also honours.
8
+
9
+ ### Patch Changes
10
+
11
+ - Updated dependencies [d1e3310]
12
+ - @seamless-auth/client@0.5.0
13
+
3
14
  ## 0.2.3
4
15
 
5
16
  ### Patch Changes
package/README.md CHANGED
@@ -96,7 +96,10 @@ function SignIn() {
96
96
 
97
97
  `useAuthorizedFetch()` is a fetch for your own API that carries the access
98
98
  token and refreshes it once on a 401; a path resolves on `apiHost`, and a path
99
- under the adapter's mount (`/auth/sessions`) is sent as an adapter call:
99
+ under the adapter's mount (`/auth/sessions`) is sent as an adapter call. The
100
+ token goes only to `apiHost` and the origins in the provider's `trustedOrigins`
101
+ prop; any other origin rejects with `UntrustedOriginError` before anything is
102
+ sent:
100
103
 
101
104
  ```ts
102
105
  const authorizedFetch = useAuthorizedFetch();
@@ -30,6 +30,11 @@ export interface AuthProviderProps {
30
30
  ports: NativeAuthPorts;
31
31
  /** The fetch to use, for tests and instrumented builds. Defaults to the global one. */
32
32
  fetch?: typeof fetch;
33
+ /**
34
+ * Origins besides `apiHost` that `useAuthorizedFetch` may send the access
35
+ * token to. Every other origin is refused.
36
+ */
37
+ trustedOrigins?: string[];
33
38
  }
34
39
  /**
35
40
  * The session for a React Native application, always over bearer transport:
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, } from '@seamless-auth/client';
15
+ export { createSeamlessAuthClient, encodePrfSalt, extractPasskeyPrfResult, getOAuthErrorCode, getPasskeyPolicyErrorCode, getWebAuthnErrorDetail, hasScopedRole, isUnauthenticated, PasskeyCeremonyError, roleGrantsAccess, SeamlessAuthError, UntrustedOriginError, } 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,createSeamlessAuthClient,encodePrfSalt,extractPasskeyPrfResult,getOAuthErrorCode,getPasskeyPolicyErrorCode,getWebAuthnErrorDetail,hasNonPasskeyLoginMethod,hasScopedRole,isUnauthenticated,roleGrantsAccess}from"@seamless-auth/client";import{createContext as a,useContext as c,useMemo as i,useSyncExternalStore as l,useEffect as u,useState as d}from"react";const h=a(void 0),y=()=>{const e=c(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:c,fetch:d})=>{const{passkeys:y,oauthRedirect:p,tokenStorage:f}=c,m=i(()=>t({apiHost:n,magicLinkRedirectUri:a,passkeys:y,transport:{mode:"bearer",basePath:o,tokenStorage:f??r(),fetch:d},detectPreviousSignIn:!1}),[n,o,a,y,f,d]),g=l(m.subscribe,m.getState,m.getState);u(()=>{m.actions.refreshSession()},[m]);const k=i(()=>({...g,...m.actions,apiHost:n,magicLinkRedirectUri:a,client:m.client,ports:{passkeys:y,oauthRedirect:p,tokenStorage:f}}),[g,m,n,a,y,p,f]);return e(h.Provider,{value:k,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 m=()=>y().client,g=()=>y().client.authorizedFetch,k=()=>{const e=m(),[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 P(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 v(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 O(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=v(n.url);return o?{type:"callback",...o}:{type:"cancelled"}}}}export{p as AuthProvider,A as createNativePasskeyPort,P as createSecureStoreTokenStorage,O as createWebBrowserOAuthRedirect,f as describeDevice,v as parseOAuthCallbackUrl,y as useAuth,m as useAuthClient,g 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,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","passkeys","oauthRedirect","tokenStorage","session","useMemo","createAuthSession","transport","mode","createMemoryTokenStorage","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","JSON","parse","accessToken","refreshToken","set","tokens","setItemAsync","stringify","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.2.3",
3
+ "version": "0.3.0",
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.4.0",
48
+ "@seamless-auth/client": "^0.5.0",
49
49
  "@seamless-auth/types": "^0.28.0"
50
50
  },
51
51
  "sideEffects": false