@passageidentity/passage-react v0.9.4
About
Passage by 1Password unlocks the passwordless future with a simpler, more secure passkey authentication experience. Passage handles the complexities of the WebAuthn API, and allows you to implement passkeys with ease.
Use Passkey Flex to add passkeys to an existing authentication experience.
Use Passkey Complete as a standalone passwordless auth solution.
Use Passkey Ready to determine if your users are ready for passkeys.
In passage-react
Passage-React the easiest way to use Passage Passkey Complete in your React application. Passage-React provides native react integration with the Passage elements, modular components that provides complete UI/UX for modern authentication, embedded directly into your website.
What's Included?
š User login, registration, and profile cross-platform elements.
šØ Complete UI/UX for all device types and auth flows ā in other words, it just works.
š Full passkey authentication.
⨠Magic Link and One-Time Passcodes over email or SMS.
š„ Authentication with Social providers.
Product | Compatible |
---|---|
![]() | āļø For Passkey Flex, check out passage-flex-js |
![]() | ā |
![]() | āļø For Passkey Ready, check out Authentikit |
Getting Started
Check Prerequisites
Install
npm i @passageidentity/passage-react
Configure passage-react in your React application
Configure passage-react by wrapping your application with a PassageProvider
- Import the PassageProvider
- Wrap your application code with the PassageProvider
- Pass your Passage app id to the PassageProvider
// src/index.tsx
import React from 'react';
import ReactDOM from 'react-dom/client';
import App from './App';
// Import the PassageProvider
import { PassageProvider } from '@passageidentity/passage-react';
ReactDOM.createRoot(document.getElementById('root') as HTMLElement).render(
<React.StrictMode>
// Wrap your application code with PassageProvider // providing your Passage app id
<PassageProvider appId='YOUR_PASSAGE_APP_ID'>
<App />
</PassageProvider>
</React.StrictMode>,
);
Add a login or register component
In your application use one of the Passage Authentication components to display a login form for your users.
// src/login.tsx
import React from 'react';
import { PassageAuth } from '@passageidentity/passage-react';
export const LoginPage: React.FC = () => {
return (
<>
<PassageAuth />
</>
);
};
Support & Feedback
We are here to help! Find additional docs, the best ways to get in touch with our team, and more within our support resources.
API Reference
Configuration Components
PassageProvider
The PassageProvider component wraps your application to provide the configuration for other Passage Components.
// Import the PassageProvider
import { PassageProvider } from '@passageidentity/passage-react';
<PassageProvider appId='YOUR_PASSAGE_APP_ID'>
<App />
</PassageProvider>;
Props
Name | Required | Type | Description |
---|---|---|---|
appId | Yes | string | Your Passage app id. |
defaultCountryCode | No | string | ISO Country code |
lang | No | string | Default language |
theme (deprecated) | No | PassageThemeProps | Passage Theme, theme is deprecated, use the new lightTheme and darkTheme properties instead. Theme will apply a light theme. |
lightTheme | No | PassageThemeProps | Passage Theme |
darkTheme | No | PassageThemeProps | Passage Theme |
Authentication/Registration Components
PassageAuth
Renders the passage-auth element.
// src/login.tsx
import React from 'react';
import { PassageAuth } from '@passageidentity/passage-react';
export const AuthPage: React.FC = () => {
return (
<>
<h1>Example Login or Register Page</h1>
<PassageAuth />
</>
);
};
Props
Name | Required | Type | Description |
---|---|---|---|
appId | No* | string | Your Passage app id. |
defaultCountryCode | No* | string | ISO Country code |
lang | No* | string | Default language |
beforeAuth | No | BeforeAuthCallback | Method to call before authentication |
onSuccess | No | OnSuccessCallback | Method to call on authentication success |
tokenStore | No | TokenStore | Custom token store instance |
theme | No | "light", "dark", "auto" | Use a light, dark, or auto theme |
Note: If not using the PassageProvider the appId property is required. If using the PassageProvider appId, defaultCountryCode, and lang props will be loaded from the PassageProvider but if passed in will override the values for this component instance only.
PassageRegister
Renders the passage-register element.
// src/login.tsx
import React from 'react';
import { PassageRegister } from '@passageidentity/passage-react';
export const RegisterPage: React.FC = () => {
return (
<>
<h1>Example Register Page</h1>
<PassageRegister />
</>
);
};
Props
Name | Required | Type | Description |
---|---|---|---|
appId | No* | string | Your Passage app id. |
defaultCountryCode | No* | string | ISO Country code |
lang | No* | string | Default language |
beforeAuth | No | BeforeAuthCallback | Method to call before authentication |
onSuccess | No | OnSuccessCallback | Method to call on authentication success |
tokenStore | No | TokenStore | Custom token store instance |
theme | No | "light", "dark", "auto" | Use a light, dark, or auto theme |
Note: If not using the PassageProvider the appId property is required. If using the PassageProvider appId, defaultCountryCode, and lang props will be loaded from the PassageProvider but if passed in will override the values for this component instance only.
PassageLogin
Renders the passage-login element.
// src/login.tsx
import React from 'react';
import { PassageLogin } from '@passageidentity/passage-react';
export const LoginPage: React.FC = () => {
return (
<>
<h1>Example Login Page</h1>
<PassageLogin />
</>
);
};
Props
Name | Required | Type | Description |
---|---|---|---|
appId | No* | string | Your Passage app id. |
defaultCountryCode | No* | string | ISO Country code |
lang | No* | string | Default language |
beforeAuth | No | BeforeAuthCallback | Method to call before authentication |
onSuccess | No | OnSuccessCallback | Method to call on authentication success |
tokenStore | No | TokenStore | Custom token store instance |
theme | No | "light", "dark", "auto" | Use a light, dark, or auto theme |
Note: If not using the PassageProvider the appId property is required. If using the PassageProvider appId, defaultCountryCode, and lang props will be loaded from the PassageProvider but if passed in will override the values for this component instance only.
User Components
PassageProfile
Renders the passage-profile element.
// src/login.tsx
import React from 'react';
import { PassageProfile } from '@passageidentity/passage-react';
export const ProfilePage: React.FC = () => {
return (
<>
<h1>Example Profile Page</h1>
<PassageProfile />
</>
);
};
Props
Name | Required | Type | Description |
---|---|---|---|
appId | No* | string | Your Passage app id. |
defaultCountryCode | No* | string | ISO Country code |
lang | No* | string | Default language |
tokenStore | No | TokenStore | Custom token store instance |
theme | No | "light", "dark", "auto" | Use a light, dark, or auto theme |
Note: If not using the PassageProvider the appId property is required. If using the PassageProvider appId, defaultCountryCode, and lang props will be loaded from the PassageProvider but if passed in will override the values for this component instance only.
PassagePasskeyTable
Renders the passage-passkey-table element.
// src/login.tsx
import React from 'react';
import { PassagePasskeyTable } from '@passageidentity/passage-react';
export const PasskeyTablePage: React.FC = () => {
return (
<>
<h1>Example Passkey Table Page</h1>
<PassagePasskeyTable />
</>
);
};
Props
Name | Required | Type | Description |
---|---|---|---|
appId | No* | string | Your Passage app id. |
defaultCountryCode | No* | string | ISO Country code |
lang | No* | string | Default language |
tokenStore | No | TokenStore | Custom token store instance |
theme | No | "light", "dark", "auto" | Use a light, dark, or auto theme |
Note: If not using the PassageProvider the appId property is required. If using the PassageProvider appId, defaultCountryCode, and lang props will be loaded from the PassageProvider but if passed in will override the values for this component instance only.
Guard Components
PassageAuthGuard
Protects content by requiring a logged in user to view the content.
A component can be passed in which will render when the user has not been authenticated. The default is to render null.
// src/login.tsx
import React from 'react';
import { PassageAuthGuard } from '@passageidentity/passage-react';
export const ProtectedPage: React.FC = () => {
return (
<PassageAuthGuard>
<p>Protected content</p>
</PassageAuthGuard>
);
};
Props
Name | Required | Type | Description |
---|---|---|---|
unAuthComp | No | React.ReactNode | Component to render if the user is not authenticated |
PassageUnAuthGuard
The opposite of PassageAuthGuard ensures a user is NOT authenticated to view the content.
A component can be passed in which will render when the user is authenticated. The default is to render null.
// src/login.tsx
import React from 'react';
import { PassageUnAuthGuard } from '@passageidentity/passage-react';
export const UnAuthOnlyPage: React.FC = () => {
return (
<PassageUnAuthGuard>
<p>Protected content</p>
</PassageUnAuthGuard>
);
};
Props
Name | Required | Type | Description |
---|---|---|---|
authComp | No | React.ReactNode | Component to render if the user is authenticated |
Styling Components
PassageTheme (Deprecated)
Note: PassageTheme has been deprecated. Use the PassageLightTheme or PassageDarkTheme components instead. PassageTheme will now apply a Light theme.
The PassageTheme component can customize the look and feel of the Passage Element to match your brand.
// src/login.tsx
import React from 'react';
import { PassageAuth, PassageTheme } from '@passageidentity/passage-react';
export const RegisterPage: React.FC = () => {
return (
<>
<h1>Example Register Page</h1>
<PassageTheme primaryColor="#ff0000">
<PassageRegister />
</PassageTheme>
</>
);
};
Props
Name | Required | Type | Default Value |
---|---|---|---|
bodyFontFamily | No | string | 'Helvetica', BlinkMacSystemFont, -apple-system, 'Segoe UI', 'Roboto', 'Oxygen', 'Ubuntu', 'Cantarell', 'Fira Sans', 'Droid Sans', 'Helvetica Neue', 'Helvetica', 'Arial', sans-serif |
headerFontFamily | No | string | 'Helvetica', BlinkMacSystemFont, -apple-system, 'Segoe UI', 'Roboto', 'Oxygen', 'Ubuntu', 'Cantarell', 'Fira Sans', 'Droid Sans', 'Helvetica Neue', 'Helvetica', 'Arial', sans-serif |
containerBackgroundColor | No | string | #fff |
containerMaxWidth | No | string | 300px |
containerMargin | No | string | auto |
containerPadding | No | string | 30px 30px 20px |
errorColor | No | string | #dd0031 |
bodyFontSize | No | string | 14px |
bodyFontWeight | No | string | 400 |
bodyTextColor | No | string | #000 |
headerFontSize | No | string | 24px |
headerFontWeight | No | string | 700 |
headerTextColor | No | string | #000 |
anchorTextColor | No | string | #000 |
anchorHoverColor | No | string | #4d4d4d |
anchorActiveColor | No | string | #6b6b6b |
otpInputBackgroundColor | No | string | #fff |
inputTextColor | No | string | #000 |
inputBoxBackgroundColor | No | string | #fff |
inputBoxBorderRadius | No | string | 5px |
checkboxBackgroundColor | No | string | #000 |
checkboxTextColor | No | string | #fff |
controlBorderRadius | No | string | 5px |
controlBorderColor | No | string | #d7d7d7 |
controlBorderActiveColor | No | string | #000 |
buttonFontSize | No | string | 16px |
buttonFontWeight | No | string | 400 |
buttonWidth | No | string | 50% |
primaryButtonBackgroundColor | No | string | #000 |
primaryButtonTextColor | No | string | #fff |
primaryButtonBorderRadius | No | string | 5px |
primaryButtonBorderColor | No | string | #000 |
primaryButtonBorderWidth | No | string | 0px |
primaryButtonBorderHoverColor | No | string | #000 |
primaryButtonTextHoverColor | No | string | #fff |
primaryButtonBackgroundHoverColor | No | string | #4d4d4d |
primaryButtonTextActiveColor | No | string | #fff |
primaryButtonBackgroundActiveColor | No | string | #6b6b6b |
primaryButtonBorderActiveColor | No | string | #000 |
secondaryButtonBackgroundColor | No | string | #fff |
secondaryButtonTextColor | No | string | #000 |
secondaryButtonBorderRadius | No | string | 5px |
secondaryButtonBorderColor | No | string | #000 |
secondaryButtonBorderWidth | No | string | #000 |
secondaryButtonBorderHoverColor | No | string | #4d4d4d |
secondaryButtonTextHoverColor | No | string | #000 |
secondaryButtonBackgroundHoverColor | No | string | #d7d7d7 |
secondaryButtonTextActiveColor | No | string | #000 |
secondaryButtonBackgroundActiveColor | No | string | #e0e0e0 |
secondaryButtonBorderActiveColor | No | string | #6b6b6b |
tableHeaderBorderColor | No | string | #d7d7d7 |
tableRowBorderColor | No | string | #e8e8e8 |
tablePaginatorSelectedColor | No | string | #d7d7d7 |
tablePaginatorHoverColor | No | string | #e8e8e8 |
tableDeviceInfoColorDefault | No | string | #6b6b6b |
tableDeviceIconColorDefault | No | string | #6b6b6b |
tableActionIconHoverColorDefault | No | string | #6b6b6b |
PassageLightTheme
The PassageTheme component can customize the look and feel of the Passage Element to match your brand.
// src/login.tsx
import React from 'react';
import { PassageAuth, PassageTheme } from '@passageidentity/passage-react';
export const RegisterPage: React.FC = () => {
return (
<>
<h1>Example Register Page</h1>
<PassageTheme primaryColor="#ff0000" />
<PassageRegister />
</>
);
};
Props
Name | Required | Type | Default Value |
---|---|---|---|
bodyFontFamily | No | string | 'Helvetica', BlinkMacSystemFont, -apple-system, 'Segoe UI', 'Roboto', 'Oxygen', 'Ubuntu', 'Cantarell', 'Fira Sans', 'Droid Sans', 'Helvetica Neue', 'Helvetica', 'Arial', sans-serif |
headerFontFamily | No | string | 'Helvetica', BlinkMacSystemFont, -apple-system, 'Segoe UI', 'Roboto', 'Oxygen', 'Ubuntu', 'Cantarell', 'Fira Sans', 'Droid Sans', 'Helvetica Neue', 'Helvetica', 'Arial', sans-serif |
containerBackgroundColor | No | string | #fff |
containerMaxWidth | No | string | 300px |
containerMargin | No | string | auto |
containerPadding | No | string | 30px 30px 20px |
errorColor | No | string | #dd0031 |
bodyFontSize | No | string | 14px |
bodyFontWeight | No | string | 400 |
bodyTextColor | No | string | #000 |
headerFontSize | No | string | 24px |
headerFontWeight | No | string | 700 |
headerTextColor | No | string | #000 |
anchorTextColor | No | string | #000 |
anchorHoverColor | No | string | #4d4d4d |
anchorActiveColor | No | string | #6b6b6b |
otpInputBackgroundColor | No | string | #d7d7d7 |
inputTextColor | No | string | #000 |
inputBoxBackgroundColor | No | string | #fff |
inputBoxBorderRadius | No | string | 5px |
checkboxBackgroundColor | No | string | #000 |
checkboxTextColor | No | string | #fff |
controlBorderRadius | No | string | 5px |
controlBorderColor | No | string | #d7d7d7 |
controlBorderActiveColor | No | string | #000 |
buttonFontSize | No | string | 16px |
buttonFontWeight | No | string | 400 |
buttonWidth | No | string | 50% |
primaryButtonBackgroundColor | No | string | #000 |
primaryButtonTextColor | No | string | #fff |
primaryButtonBorderRadius | No | string | 5px |
primaryButtonBorderColor | No | string | #000 |
primaryButtonBorderWidth | No | string | 0px |
primaryButtonBorderHoverColor | No | string | #000 |
primaryButtonTextHoverColor | No | string | #fff |
primaryButtonBackgroundHoverColor | No | string | #4d4d4d |
primaryButtonTextActiveColor | No | string | #fff |
primaryButtonBackgroundActiveColor | No | string | #6b6b6b |
primaryButtonBorderActiveColor | No | string | #000 |
secondaryButtonBackgroundColor | No | string | #fff |
secondaryButtonTextColor | No | string | #000 |
secondaryButtonBorderRadius | No | string | 5px |
secondaryButtonBorderColor | No | string | #000 |
secondaryButtonBorderWidth | No | string | #000 |
secondaryButtonBorderHoverColor | No | string | #4d4d4d |
secondaryButtonTextHoverColor | No | string | #000 |
secondaryButtonBackgroundHoverColor | No | string | #d7d7d7 |
secondaryButtonTextActiveColor | No | string | #000 |
secondaryButtonBackgroundActiveColor | No | string | #e0e0e0 |
secondaryButtonBorderActiveColor | No | string | #6b6b6b |
tableHeaderBorderColor | No | string | #d7d7d7 |
tableRowHoverColor | No | string | #e0e0e0 |
tableRowBorderColor | No | string | #e8e8e8 |
tablePaginatorSelectedColor | No | string | #d7d7d7 |
tablePaginatorHoverColor | No | string | #e8e8e8 |
PassageDarkTheme
The PassageTheme component can customize the look and feel of the Passage Element to match your brand.
// src/login.tsx
import React from 'react';
import { PassageAuth, PassageTheme } from '@passageidentity/passage-react';
export const RegisterPage: React.FC = () => {
return (
<>
<h1>Example Register Page</h1>
<PassageTheme primaryColor="#ff0000" />
<PassageRegister />
</>
);
};
Props
Name | Required | Type | Default Value |
---|---|---|---|
bodyFontFamily | No | string | 'Helvetica', BlinkMacSystemFont, -apple-system, 'Segoe UI', 'Roboto', 'Oxygen', 'Ubuntu', 'Cantarell', 'Fira Sans', 'Droid Sans', 'Helvetica Neue', 'Helvetica', 'Arial', sans-serif |
headerFontFamily | No | string | 'Helvetica', BlinkMacSystemFont, -apple-system, 'Segoe UI', 'Roboto', 'Oxygen', 'Ubuntu', 'Cantarell', 'Fira Sans', 'Droid Sans', 'Helvetica Neue', 'Helvetica', 'Arial', sans-serif |
containerBackgroundColor | No | string | #fff |
containerMaxWidth | No | string | 300px |
containerMargin | No | string | auto |
containerPadding | No | string | 30px 30px 20px |
errorColor | No | string | #dd0031 |
bodyFontSize | No | string | 14px |
bodyFontWeight | No | string | 400 |
bodyTextColor | No | string | #000 |
headerFontSize | No | string | 24px |
headerFontWeight | No | string | 700 |
headerTextColor | No | string | #000 |
anchorTextColor | No | string | #000 |
anchorHoverColor | No | string | #4d4d4d |
anchorActiveColor | No | string | #6b6b6b |
otpInputBackgroundColor | No | string | #d7d7d7 |
inputTextColor | No | string | #000 |
inputBoxBackgroundColor | No | string | #fff |
inputBoxBorderRadius | No | string | 5px |
checkboxBackgroundColor | No | string | #000 |
checkboxTextColor | No | string | #fff |
controlBorderRadius | No | string | 5px |
controlBorderColor | No | string | #d7d7d7 |
controlBorderActiveColor | No | string | #000 |
buttonFontSize | No | string | 16px |
buttonFontWeight | No | string | 400 |
buttonWidth | No | string | 50% |
primaryButtonBackgroundColor | No | string | #000 |
primaryButtonTextColor | No | string | #fff |
primaryButtonBorderRadius | No | string | 5px |
primaryButtonBorderColor | No | string | #000 |
primaryButtonBorderWidth | No | string | 0px |
primaryButtonBorderHoverColor | No | string | #000 |
primaryButtonTextHoverColor | No | string | #fff |
primaryButtonBackgroundHoverColor | No | string | #4d4d4d |
primaryButtonTextActiveColor | No | string | #fff |
primaryButtonBackgroundActiveColor | No | string | #6b6b6b |
primaryButtonBorderActiveColor | No | string | #000 |
secondaryButtonBackgroundColor | No | string | #fff |
secondaryButtonTextColor | No | string | #000 |
secondaryButtonBorderRadius | No | string | 5px |
secondaryButtonBorderColor | No | string | #000 |
secondaryButtonBorderWidth | No | string | #000 |
secondaryButtonBorderHoverColor | No | string | #4d4d4d |
secondaryButtonTextHoverColor | No | string | #000 |
secondaryButtonBackgroundHoverColor | No | string | #d7d7d7 |
secondaryButtonTextActiveColor | No | string | #000 |
secondaryButtonBackgroundActiveColor | No | string | #e0e0e0 |
secondaryButtonBorderActiveColor | No | string | #6b6b6b |
tableHeaderBorderColor | No | string | #d7d7d7 |
tableRowHoverColor | No | string | #e0e0e0 |
tableRowBorderColor | No | string | #e8e8e8 |
tablePaginatorSelectedColor | No | string | #d7d7d7 |
tablePaginatorHoverColor | No | string | #e8e8e8 |
Hooks
usePassage
Provides access to the Passage configuration, an instance of passage.js and other Passage functionality.
import { usePassageJS } from '@passageidentity/passage-react';
import { Passage, Session, User } from '@passageidentity/passage-js';
const MyComponent = () => {
// if using PassageProvider
const { passageInstance, currentSession, currentUser, appId, lang, defaultCountryCode } =
usePassageJS();
// if not useing PassageProvider
const { passageInstance, currentSession, currentUser, appId, lang, defaultCountryCode } =
usePassageJS({ appId: 'YOUR_PASSAGE_APP_ID', lang: 'en'', defaultCountryCode: 'us'});
// other code using data or methods provided by usePassage
};
Parameters
If using the PassageProvider to wrap your app, then you do not need to pass any parameters, unless you want to override a setting for this hook instance only.
Name | Required | Type | Description |
---|---|---|---|
props | No | UsePassageHookProps | Passage Configuration |
UsePassageHookProps
Name | Required | Type | Description |
---|---|---|---|
appId | No | string | Your Passage app id. |
defaultCountryCode | No | string | ISO Country code |
lang | No | string | Default language |
tokenStore | No | TokenStore | Custom token store instance |
Returns
Name | Type | Description |
---|---|---|
appId | string | Your Passage app id. |
defaultCountryCode | string | ISO Country code |
lang | string | Default language |
passageInstance | passage.js | Instance of Passage |
getCurrentSession | GetCurrentSessionFn | The current users Passage Session |
getCurrentUser | GetCurrentUserFn | The current user |
signOut | PassageSignOutFn | Method than can be called to sign out the current user |
Types
BeforeAuthCallback
type BeforeAuthCallback = (email: string) => boolean;
OnSuccessCallback
type OnSuccessCallback = (authResult: authResult) => void;
TokenStore
Learn how to create a custom token store here.
type TokenStore = () => TokenStore;
PassageSignOutFn
type PassageSignOutFn = () => Promise<boolean>;
GetCurrentUserFn
type GetCurrentUserFn = () => User | undefined;
GetCurrentSessionFn
type GetCurrentSessionFn = () => Session | undefined;
PassageThemeProps
interface PassageThemeProps {
primaryColor?: string;
containerBackground?: string;
containerBackgroundColor?: string;
containerMaxWidth?: string;
containerMargin?: string;
containerPadding?: string;
errorColor?: string;
bodyFontFamily?: string;
bodyFontSize?: string;
bodyFontWeight?: string;
bodyTextColor?: string;
headerFontFamily?: string;
headerFontSize?: string;
headerFontWeight?: string;
headerTextColor?: string;
butonFontSize?: string;
buttonFontWeight?: string;
buttonWidth?: string;
buttonBorderRadius?: string;
onprimaryColor?: string;
onHoverColor?: string;
hoverColor?: string;
onactiveColor?: string;
activeColor?: string;
controlBorderRadius?: string;
controlBorderColor?: string;
tableHeaderBorderColor?: string;
tableRowBorderColor?: string;
tablePaginatorSelectedColor?: string;
tablePaginatorHoverColor?: string;
tableRowBorderColor?: string;
tablePaginatorSelectedColor?: string;
tablePaginatorHoverColor?: string;
}
8 months ago
9 months ago
9 months ago
9 months ago
10 months ago
10 months ago
11 months ago
1 year ago
10 months ago
1 year ago
1 year ago
1 year ago
1 year ago
1 year ago
1 year ago
1 year ago
1 year ago
1 year ago
1 year ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago