Note: This document is only for Okta Classic Engine. If you are using Okta Identity Engine, see Sign in to SPA with Auth JS. See Identify your Okta solution (opens new window) to determine your Okta version.
This guide will walk you through integrating authentication into a React app with Okta by performing these steps:
This guide is for @okta/okta-auth-js
v5.1.1 and @okta/okta-react
v6.0.0.
Prerequisites
If you do not already have a Developer Edition Account, you can create one at https://developer.okta.com/signup/ (opens new window).
Add an OpenID Connect Client in Okta
- Sign in to the Okta Developer Dashboard, and select Create New App
- Choose Single Page App (SPA) as the platform, then populate your new OpenID Connect application with appropriate values for your app. For example:
Setting | Value |
App Name | OpenID Connect App (must be unique) |
Login redirect URIs | http://localhost:3000/login/callback |
Logout redirect URIs | http://localhost:3000/ |
Allowed grant types | Authorization Code |
Note: It is important to choose the appropriate application type for apps which are public clients. Failing to do so may result in Okta API endpoints attempting to verify an app's client secret, which public clients are not designed to have, hence breaking the sign-in or sign-out flow.
Note: CORS is automatically enabled for the granted login redirect URIs.
Create a React App
To create a React app, you can use Create React App (opens new window):
This creates a new project in a folder named okta-app
and installs all required dependencies.
Install Dependencies
A simple way to add authentication to a React app is using the Okta Auth JS library. You can install it using npm
:
You also need @okta/okta-react
and react-router-dom
to manage your routes. You can use @okta/okta-react
to support other router libraries, but react-router-dom
has pre-existing support.
If the Okta Sign-In Widget doesn't fit your needs, Okta Auth JS provides lower-level access to User Lifecycle operations, MFA, and more. For this example, you create a simple username and password form without MFA.
Create a src/SignInForm.jsx
file:
src/SignInForm.jsx
using a function-based component:
src/SignInForm.jsx
using a class-based component:
Create Routes
Some routes require authentication in order to render. Defining those routes is easy using SecureRoute
from @okta/okta-react
. Let's take a look at what routes are needed for this example:
/
: A default page to handle basic control of the app. /protected
: A route protected by SecureRoute
. /login
: Redirect to the org sign-in page. /login/callback
: A route to parse tokens after a redirect.
/
First, create src/Home.jsx
to provide links to navigate our app:
src/Home.jsx
using a function-based component:
src/Home.jsx
using a class-based component:
/protected
This route will only be visible to users with a valid accessToken
.
Create a new component src/Protected.jsx
:
/login
This route redirects if the user is already logged in. If the user is coming from a protected page, they'll be redirected back to the page upon successful sign in.
Create a new component src/SignIn.jsx
:
src/SignIn.jsx
using a function-based component:
src/SignIn.jsx
using a class-based component:
/login/callback
The component for this route (LoginCallback) comes with @okta/okta-react
. It handles token parsing, token storage, and redirecting to a protected page if one triggered the sign in.
Connect the Routes
Update src/App.js
to include your project components and routes. Security
is the component that controls the authentication flows, so it requires your OpenID Connect configuration. By default, @okta/okta-react
redirects to Okta's sign-in page when the user isn't authenticated.
In this example, onAuthRequired
is overridden to redirect to the custom sign-in route instead, which requires a component that is a descendent of Router to have access to react-router
's history
. Other router libraries will have their own methods of managing browser history:
Update src/App.js
to use function-based components:
And, create its companion at src/AppWithRouterAccess.jsx
. Make sure to replace the {...}
placeholders with your Okta values.
You can also update src/App.js
and src/AppWithRouterAccess.jsx
to use class-based components:
Start your app
Finally, start your app:
Conclusion
You have now successfully authenticated with Okta! Now what? With a user's id_token
, you have basic claims for the user's identity. You can extend the set of claims by modifying the scopes
to retrieve custom information about the user. This includes locale
, address
, groups
, and more.