1.10.0 • Published 8 days ago

@vyro-x/react-auth v1.10.0

Weekly downloads
-
License
ISC
Repository
-
Last release
8 days ago

@vyro-x/react-auth

Client-side authentication for a React app

Usage

Install

npm i @vyro-x/react-auth

AuthProvider

Wrap your app with the AuthProvider

import { AuthProvider, setConfig as setAuthConfig } from '@vyro-x/react-auth';
import * as React from 'react';
import * as ReactDOM from 'react-dom/client';
import { App } from './App';

const container = document.getElementById('root');
if (!container) throw new Error('Failed to find the root element');
const root = ReactDOM.createRoot(container);

// It's important to call this early, before the AuthProvider.
setAuthConfig({
  authFrontendUrl: process.env.REACT_APP_AUTH_FRONTEND_URL,
  authApiUrl: process.env.REACT_APP_AUTH_API_URL,
});

root.render(
  <React.StrictMode>
    <AuthProvider>
      <App />
    </AuthProvider>
  </React.StrictMode>,
);

Callback URL

Add a callback URL at path=/auth/verify. This url is responsible for verifying and completing the auth flow.

import { useVerifyCallback } from '@vyro-x/react-auth';
import { useNavigate } from 'react-router';

export default function VerifyPage() {
  const navigate = useNavigate();
  useVerifyCallback({
    // This is up to you on how to handle a fatal authentication error
    onError: () => navigate('/error/500'),
  });

  return <>Loading...</>;
}

Config

Define config vars. Typically these are set in .env

REACT_APP_AUTH_FRONTEND_URL=http://127.0.0.1:8002
REACT_APP_AUTH_API_URL=http://127.0.0.1:3006

For the Vyro dev env these are:

REACT_APP_AUTH_FRONTEND_URL=https://login.vyrolabs.net
REACT_APP_AUTH_API_URL=https://authentication-api.vyrolabs.net

And in production they are:

REACT_APP_AUTH_FRONTEND_URL=https://login.vyro.com.au
REACT_APP_AUTH_API_URL=https://authentication-api.vyro.com.au

Add a login button

import { authService } from '@vyro-x/react-auth';
// ...

<button onClick={() => authService.login()}>Login</button>;

Add a logout button

import { authService } from '@vyro-x/react-auth';
// ...

<button onClick={() => authService.logout()}>Logout</button>;

Use auth state

import { useAuth } from '@vyro-x/react-auth';
// ...

const {
  // Boolean
  isAuthenticated,

  // User ID in GraphQL API
  userId,

  // Usage hasRole('admin') => boolean
  hasRole,

  // Array of roles
  roles,

  // Authentication state is initiatialising. Don't rely on the above until this is true.
  isLoading,
} = useAuth();

Protecting routes

import { Outlet, Route, Routes } from 'react-router-dom';
import { authService, useAuth } from '@vyro-x/react-auth';
import VerifyPage from './pages/auth/verify';
import ProtectedPage from './pages/protected';

const ProtectedRoutes = () => {
  const { isAuthenticated, isLoading } = useAuth();

  if (isLoading) {
    return null;
  }

  if (!isAuthenticated) {
    authService.login();
    return null;
  }

  return <Outlet />;
};

export const RoutesTree = () => {
  return (
    <Routes>
      <Route element={<ProtectedRoutes />}>
        <Route path={'/'} element={<HomePage />} />
        // This path will require the user to be logged in
        <Route path={'/i-am-protected'} element={<ProtectedPage />} />
      </Route>
      // This is your callback URL. Make sure it is public
      <Route path={'/auth/verify'} element={<VerifyPage />} />
      // You probably want this
      <Route path={'/error/500'} element={<Error500Page />} />
    </Routes>
  );
};

Use access token in an API request

import { authService } from '@vyro-x/react-auth';
// ...

axios.request({
  headers: {
    Authorization: `Bearer ${authService.tokens.getAccessToken()}`,
  },
});
1.10.0

8 days ago

1.8.0

16 days ago

1.6.0

16 days ago

1.9.0

16 days ago

1.7.1

16 days ago

1.7.0

16 days ago

1.5.12

19 days ago

1.5.13

19 days ago

1.5.10

2 months ago

1.5.11

2 months ago

1.5.9

2 months ago

1.5.5

2 months ago

1.5.4

2 months ago

1.5.3

2 months ago

1.5.2

2 months ago

1.5.1

2 months ago

1.5.8

2 months ago

1.5.7

2 months ago

1.5.6

2 months ago

1.5.0

5 months ago

1.4.0

5 months ago

1.3.0

5 months ago

1.2.2

6 months ago

1.2.1

6 months ago

1.2.0

6 months ago

1.1.1

6 months ago

1.1.0

6 months ago

1.0.16

6 months ago

1.0.15

6 months ago

1.0.14

6 months ago

1.0.13

6 months ago

1.0.12

6 months ago

1.0.11

7 months ago

1.0.9

7 months ago

1.0.8

7 months ago

1.0.7

7 months ago

1.0.6

7 months ago

1.0.5

7 months ago

1.0.4

7 months ago

1.0.3

7 months ago

1.0.2

7 months ago

1.0.1

7 months ago

1.0.0

7 months ago

0.1.4

7 months ago

0.1.3

7 months ago

0.1.2

7 months ago

0.1.1

7 months ago

0.1.0

7 months ago

0.0.4

7 months ago

0.0.3

9 months ago

0.0.2

9 months ago

0.0.1

9 months ago