
Security News
Feross on Risky Business Weekly Podcast: npm’s Ongoing Supply Chain Attacks
Socket CEO Feross Aboukhadijeh joins Risky Business Weekly to unpack recent npm phishing attacks, their limited impact, and the risks if attackers get smarter.
okta-react-temp
Advanced tools
Okta React SDK makes it easy to integrate react-router with Okta's OpenID Connect API.
This library currently supports:
In Okta, applications are OpenID Connect clients that can use Okta Authorization servers to authenticate users. Your Okta Org already has a default authorization server, so you just need to create an OIDC client that will use it.
Setting | Value |
---|---|
App Name | My SPA App |
Base URIs | http://localhost:{port} |
Login redirect URIs | http://localhost:{port}/implicit/callback |
Grant Types Allowed | Implicit |
After you have created the application there are two more values you will need to gather:
Setting | Where to Find |
---|---|
Client ID | In the applications list, or on the "General" tab of a specific application. |
Org URL | On the home screen of the developer dashboard, in the upper right. |
These values will be used in your React application to setup the OpenID Connect flow with Okta.
This library is available through npm. To install it, simply add it to your project:
npm install --save @okta/okta-react
okta-react
works directly with react-router
and provides four additional components:
Route
except authentication is needed to render the component.Here are the minimum requirements for a working example:
// src/App.js
import React, { Component } from 'react';
import { BrowserRouter as Router, Route } from 'react-router-dom';
import { Security, SecureRoute, ImplicitCallback } from '@okta/okta-react';
import Home from './Home';
import Protected from './Protected';
class App extends Component {
render() {
return (
<Router>
<Security issuer='https://{yourOktaDomain}.com/oauth2/default'
client_id='{clientId}'
redirect_uri={window.location.origin + '/implicit/callback'} >
<Route path='/' exact={true} component={Home}/>
<SecureRoute path='/protected' component={Protected}/>
<Route path='/implicit/callback' component={ImplicitCallback} />
</Security>
</Router>
);
}
}
export default App;
In the relevant location in your application, you will want to provide Login
and Logout
buttons for the user. You can show/hide the correct button by using the auth.isAuthenticated()
method. For example:
// src/Home.js
import React, { Component } from 'react';
import { withAuth } from '@okta/okta-react';
export default withAuth(class Home extends Component {
constructor(props) {
super(props);
this.state = { authenticated: null };
this.checkAuthentication = this.checkAuthentication.bind(this);
this.login = this.login.bind(this);
this.logout = this.logout.bind(this);
}
async checkAuthentication() {
const authenticated = await this.props.auth.isAuthenticated();
if (authenticated !== this.state.authenticated) {
this.setState({ authenticated });
}
}
async login() {
this.props.auth.login('/');
}
async logout() {
this.props.auth.logout('/');
}
async componentDidMount() {
this.checkAuthentication();
}
async componentDidUpdate() {
this.checkAuthentication();
}
render() {
if (this.state.authenticated === null) return null;
return this.state.authenticated ?
<button onClick={this.logout}>Logout</button> :
<button onClick={this.login}>Login</button>;
}
});
When your users are authenticated, your React application has an access token that was issued by your Okta Authorization server. You can use this token to authenticate requests for resources on your server or API. As a hypothetical example, let's say you have an API that provides messages for a user. You could create a MessageList
component that gets the access token and uses it to make an authenticated request to your server.
Here is what the React component could look like for this hypothetical example:
import fetch from 'isomorphic-fetch';
import React, { Component } from 'react';
import { withAuth } from '@okta/okta-react';
export default withAuth(class MessageList extends Component {
constructor(props) {
super(props)
this.state = {
messages: null
}
}
async componentDidMount() {
try {
const response = await fetch('http://localhost:{serverPort}/api/messages', {
headers: {
Authorization: 'Bearer ' + await this.props.auth.getAccessToken()
}
});
const data = await response.json();
this.setState({ messages: data.messages });
} catch (err) {
// handle error as needed
}
}
render() {
if (!this.state.messages) return <div>Loading..</div>;
const items = this.state.messages.map(message =>
<li key={message}>{message}</li>
);
return <ul>{items}</ul>;
}
});
Security
Security is the top-most component of okta-react. This is where most of the configuration is provided.
issuer (required) - The OpenId Connect issuer
client_id (required) - The OpenId Connect client_id
redirect_uri (required) - Where the callback handler is hosted
scope (optional): Reserved or custom claims to be returned in the tokens
response_type (optional): Desired token grant types
onAuthRequired (optional)
auth (optional) - Provide an Auth object instead of the options above. This is helpful when integrating okta-react
with external libraries that need access to the tokens.
Accepts a callback to make a decision when authentication is required. If this is not supplied, okta-react
redirects to Okta. This callback will receive auth
and history
parameters. This is triggered when:
auth.login
is calledfunction customAuthHandler({auth, history}) {
// Redirect to the /login page that has a CustomLoginComponent
history.push('/login');
}
class App extends Component {
render() {
return (
<Router>
<Security issuer='https://{yourOktaDomain}.com/oauth2/default'
client_id='{clientId}'
redirect_uri={window.location.origin + '/implicit/callback'}
onAuthRequired={customAuthHandler} >
<Router path='/login' component={CustomLoginComponent}>
{/* some routes here */}
</Security>
</Router>
);
}
}
// src/App.js
import React, { Component } from 'react';
import { Router, Route } from 'react-router-dom';
import { Security, SecureRoute, ImplicitCallback, Auth } from '@okta/okta-react';
import Home from './Home';
import Protected from './Protected';
import { createBrowserHistory } from 'history'
const history = createBrowserHistory();
const auth = new Auth({
history,
issuer: 'https://{yourOktaDomain}.com/oauth2/default',
client_id: '{clientId}',
redirect_uri: window.location.origin + '/implicit/callback',
onAuthRequired: ({history}) => history.push('/login')
});
class App extends Component {
render() {
return (
<Router history={history}>
<Security auth={auth} >
<Route path='/' exact={true} component={Home}/>
<SecureRoute path='/protected' component={Protected}/>
<Route path='/implicit/callback' component={ImplicitCallback} />
</Security>
</Router>
);
}
}
export default App;
SecureRoute
SecureRoute
ensures that a route is only rendered if the user is authenticated. If the user is not authenticated, it calls onAuthRequired
if it exists, otherwise, it redirects to Okta.
ImplicitCallback
ImplicitCallback
handles the callback after the redirect. By default, it parses the tokens from the uri, stores them, then redirects to /
. If a SecureRoute
caused the redirect, then the callback redirects to the secured route.
withAuth
withAuth
provides a way for components to make decisions based on auth state. It injects an auth
prop into the component.
auth
auth
provides methods that allow managing tokens and auth state. All of the methods return Promises.
auth.isAuthenticated()
Returns true
or false
, depending on whether the user has an active access or id token.
auth.getUser()
Returns the result of the OpenID Connect /userinfo
endpoint if an access token exists.
auth.getIdToken()
Retrieves the id token from storage if it exists.
auth.getAccessToken()
Retrieves the access token from storage if it exists.
auth.login(fromUri, additionalParams)
Calls onAuthRequired
or redirects to Okta if onAuthRequired
is undefined. This method accepts a fromUri
parameter to push the user to after successful authentication, and an optional additionalParams
object.
For more information on additionalParams
, see the auth.redirect
method below.
auth.logout(uri)
Terminates the user's session in Okta and clears all stored tokens. Accepts an optional uri
parameter to push the user to after logout.
auth.redirect(additionalParams)
Performs a full-page redirect to Okta with optional request parameters.
The additionalParams
are mapped to Okta's /authorize
request parameters. This will override any existing configuration. As an example, if you have an Okta sessionToken
, you can bypass the full-page redirect by passing in this token. This is recommended when using the Okta Sign-In Widget. Simply pass in a sessionToken
into the redirect
method as follows:
auth.redirect({
sessionToken: '{sampleSessionToken}'
});
Note: For information on obtaining a
sessionToken
using the Okta Sign-In Widget, please see therenderEl()
example.
auth.handleAuthentication()
Parses tokens from the url and stores them.
git clone git@github.com:okta/okta-oidc-js.git
npm i lerna -g
):
lerna bootstrap
okta-react
package:
cd packages/okta-react
okta-react/src/
ISSUER
- your authorization serverCLIENT_ID
- the client id of your appUSERNAME
- username of org user, needed if you want to run testsPASSWORD
- password of org user, needed if you want to run testsnpm start
Command | Description |
---|---|
npm start | Start the sample app using the SDK |
npm test | Run integration tests |
npm run lint | Run eslint linting tests |
FAQs
Unofficial fork for react-okta
The npm package okta-react-temp receives a total of 2 weekly downloads. As such, okta-react-temp popularity was classified as not popular.
We found that okta-react-temp demonstrated a not healthy version release cadence and project activity because the last version was released a year ago. It has 1 open source maintainer collaborating on the project.
Did you know?
Socket for GitHub automatically highlights issues in each pull request and monitors the health of all your open source dependencies. Discover the contents of your packages and block harmful activity before you install or update your dependencies.
Security News
Socket CEO Feross Aboukhadijeh joins Risky Business Weekly to unpack recent npm phishing attacks, their limited impact, and the risks if attackers get smarter.
Product
Socket’s new Tier 1 Reachability filters out up to 80% of irrelevant CVEs, so security teams can focus on the vulnerabilities that matter.
Research
/Security News
Ongoing npm supply chain attack spreads to DuckDB: multiple packages compromised with the same wallet-drainer malware.