Authgear helps you add user logins to your React apps. It provides a pre-built login page and user settings page that can accelerate your development process.
Follow this 15-minute tutorial to create a simple app using React with the Authgear SDK.
To use Authgear's features, you'll need an account and a Project. Sign up for a free account at https://portal.authgear.com/ and create a new Project to get started.
After that, we will need to create an Application in the Project Portal.
Create an application in the Portal
To create a client application, first, go to Applications on the left menu bar in Authgear Portal.
Next, click ⊕Add Application in the top toolbar.
Input the name of your application, e.g. "MyAwesomeApp", then select Single Page Application as the Application Type.
Click the Save button to create the application.
On the next screen, you'll see links to tutorials for different frameworks. Click Next to skip to the application configuration page.
Configure Authorize Redirect URI
The Authorized Redirect URI is a URL in you application where the user will be redirected to after login with Authgear. In this path, make a finish authentication call to complete the login process.
Go to the URI section of the Authgear client application you just created and add a new Authorized Redirect URI. For this tutorial, add http://localhost:4000/auth-redirect to Authorize Redirect URIs.
Click Save to keep all client app configuration changes before proceeding to the next steps.
Add Authgear to React App
In this section, we'll create a simple React application and connect it to Authgear such that, users of the app will log in, view their user settings, and log out of their account.
Step 1: Create a simple React project
Here are some recommended steps to scaffold a React project. You can skip this part if you are adding Authgear to an existing project. See #install-authgear-sdk-to-the-project in the next section.
Create a new React project using Vite
Run the following command from your preferred folder to create a new React project:
# Create a new project using vitenpmcreatevite@latestmy-app----templatereact-ts
Next, run the following commands to open the new project directory and install the dependencies:
cdmy-appnpminstall
Change port
In the package.json file, update the value of dev field in the script.dev section to:
"dev": "vite --port 4000",
This will enable the npm run dev command run the app in development mode on port 4000.
The file structure in your project should look like this now:
The Authgear container instance takes endpoint and clientID as parameters. They can be obtained from the configuration page for the application created in Setup Application in Authgear. Create a .env file in the root directory of your project and add your Authgear client application configuration using the following fields:
It is recommended to render the app after configure() resolves. So by the time the app is rendered, Authgear is ready to use.
Runnpm run devnow and you should see the default page again and no error message in the console if Authgear SDK is configured successfully
Step 3: Implement the Context Provider
Since we want to reference the logged-in state everywhere in the app, let's put the state in a context provider with UserProvider.tsx in the /src/context folder.
In UserProvider.tsx, there will be a isLoggedIn boolean and a setIsLoggedIn function. The isLoggedIn boolean state can be auto-updated using the onSessionStateChange callback. This callback can be stored in delegate which is in the local SDK container.
// src/context/UserProvider.tsximport React, { createContext, useEffect, useState, useMemo } from"react";import authgear from"@authgear/web";interfaceUserContextValue { isLoggedIn:boolean;}exportconstUserContext=createContext<UserContextValue>({ isLoggedIn:false,});interfaceUserContextProviderProps { children:React.ReactNode;}constUserContextProvider:React.FC<UserContextProviderProps> = ({ children,}) => {// By default the user is not logged inconst [isLoggedIn,setIsLoggedIn] =useState<boolean>(false);useEffect(() => {// When the sessionState changed, logged in state will also be changedauthgear.delegate = {onSessionStateChange: (container) => {// sessionState is now up to date// Value of sessionState can be "NO_SESSION" or "AUTHENTICATED"constsessionState=container.sessionState;if (sessionState ==="AUTHENTICATED") {setIsLoggedIn(true); } else {setIsLoggedIn(false); } }, }; }, [setIsLoggedIn]);constcontextValue=useMemo<UserContextValue>(() => {return { isLoggedIn, }; }, [isLoggedIn]);return ( <UserContext.Providervalue={contextValue}>{children}</UserContext.Provider> );};exportdefault UserContextProvider;
Step 4: Implement the Auth Redirect
Next, we will add an "AuthRedirect" page for handling the authentication result after the user has been authenticated by Authgear.
Create the AuthRedirect.tsx component file in the src/ folder.
Call the Authgear finishAuthentication() function in the Auth Redirect component to send a token back to Authgear server in exchange for an access token and a refresh token. Don't worry about the technical jargons, finishAuthentication() will do all the hard work for you and and save the authentication data.
When the authentication is finished, the isLoggedIn state from the UserContextProvider will be automatically set to true. Finally, navigate back to root (/) which is our Home page.
Since in React 18, useEffect will be fired twice in development mode, we need to implement a cleanup function to stop it from firing twice. We will use an useRef Hook to stop the user token from being sent twice to the Authgear Endpoint.
Without a cleanup function, anuseEffectHook will be fired twice and hence finishAuthentication() will send the token back to Authgear Endpoint for two times, which the second one will result in "Invalid Token" error since the token can only be used once.
Step 5: Add Routes and Context Provider to the App
First, install react-router-dom using the following command:
npminstall--save-exactreact-router-dom
Next, we will add a "Home" page. Create a Home.tsx component file the src/ folder.
Then import Home and AuthRedirect as routes. And Import UserContextProvider and wrap the routes with it.
First, we will import the Authgear dependency and the React Hook that we will use to Home.tsx. Then add the login button which will call startAuthentication(ConfigureOptions) through the startLogin callback on click. This will redirect the user to the login page.
// src/Home.tsximport React, { useEffect, useState, useCallback, useContext } from'react';import authgear, { PromptOption } from'@authgear/web';constHome:React.FC= () => {conststartLogin=useCallback(() => { authgear.startAuthentication({ redirectURI:import.meta.env.VITE_AUTHGEAR_REDIRECT_URL, prompt:PromptOption.Login, }).then( () => {// started authentication, user should be redirected to Authgear }, err => {// failed to start authentication } ); }, []);return ( <div> <h1>Home Page</h1> <div> <buttononClick={startLogin}>Login</button> </div> </div> );}exportdefault Home;
You can now run npm run dev and you will be redirected to the Authgear Login page when you click the Login button.
Step 7: Show the user information
The Authgear SDK helps you get the information of the logged-in users easily.
In the last step, the user is successfully logged in, so let's try to print the user ID (sub) of the user on the Home page.
In Home.tsx, we will add a simple Loading splash and a greeting message printing the Sub ID. We will add two conditional elements such that they are only shown when user is logged in. We can also change the login button to show only if the user is not logged in.
Make use of isLoggedIn from the UserContext to control the components on the page. Fetch the user info by fetchInfo() and access its sub property.
To access restricted resources on your backend application server, the HTTP requests should include the access token in their Authorization headers. The Web SDK provides a fetch function which automatically handles this, or you can get the token with authgear.accessToken.
Option 1: Using fetch function provided by Authgear SDK
Authgear SDK provides the fetch function for you to call your application server. This fetch function will include the Authorization header in your application request, and handle the process of refreshing an access token automatically. The authgear.fetch implements fetch.
Option 2: Add the access token to the HTTP request header
You can get the access token through authgear.accessToken. Call refreshAccessTokenIfNeeded every time before using the access token, the function will check and make the network call to refresh the access token only if it is expired. Include the access token into the Authorization header of the application requests.
authgear.refreshAccessTokenIfNeeded().then(() => {// access token is ready to use// accessToken can be string or undefined// it will be empty if user is not logged in or session is invalidconstaccessToken=authgear.accessToken;// include Authorization header in your application requestconstheaders= { Authorization:`Bearer ${accessToken}` }; });