0.9.0 • Published 21 days ago

whodis-react v0.9.0

Weekly downloads
17
License
-
Repository
github
Last release
21 days ago

whodis-react

React hooks and components for secure, best practices authentication in seconds

Supports both react-browser and react-native

ci_on_commit deploy_on_tag

usage

install

npm install --save whodis-react

choose your storage mechanism

if you're running this in the browser

npm install --save whodis-react-storage-browser
import { storage } from 'whodis-react-storage-browser';

if you're running this on native devices

npm install --save whodis-react-storage-native

and if you're using react-native web, you'll want both 🙂

import { storage as browserStorage } from 'whodis-react-storage-browser';
import { storage as nativeStorage } from 'whodis-react-storage-native';

const storage = environment.runtime.platform === 'native' ? nativeStorage : browserStorage;

add the authentication provider to your app

import { storage } from 'whodis-react-storage-browser'; // !: if you're running in reac

  <AuthenticationProvider
    storage={storage}
    directoryUuid={'__YOUR_DIR_UUID__'}
    clientUuid={'__YOUR_CLIENT_UUID__'}>
    {...}
  <AuthenticationProvider />

see whodis-cli to create an account and generate a directoryUuid and clientUuid

check if a user is signed in

import { useAuthenticationClaims } from 'whodis-react';

// in a component, declaratively, with a hook
const claims = useAuthenticationClaims();

see also getAuthenticationClaims for imperative access to that data

get the user id

import { useAuthenticationClaims } from 'whodis-react';

// in a component, declaratively, with a hook
const claims = useAuthenticationClaims();
const userId = claims?.sub; // claims are only defined if user is authenticated; sub = userId

see also getAuthenticationClaims for imperative access to that data

signup or login, using confirmation code challenge

import { useConfirmationCodeChallenge } from 'whodis-react';

expose Login = () => {
  const {
    askConfirmationCodeChallenge,
    answerConfirmationCodeChallenge,
    challengeHasBeenAsked,
  } = useConfirmationCodeChallenge({ storage });

  // if not already asked, get their email and ask the confirmation challenge (i.e., send them an email with a conf code)
  if (!challengeHasBeenAsked) {
    return (
      <AskForEmail onSubmit={(email) => askConfirmationCodeChallenge({
        goal: ChallengeGoal.LOGIN,
        contactMethod: { type: ContactMethodType.EMAIL, address: email },
      })}>
    )
  }

  // if challenge has been asked, then ask them for the answer
  return (
    <AskForConfirmationCode onSubmit={(code) => answerConfirmationCodeChallenge({
      answer: code
    })}>
  )
}

send the token to the backend on api calls

import { getAuthorizationHeader } from 'whodis-react';

const url = `anysubdomain.yourdomain.com/...`; // <- must be "same-site" as the website (i.e., domains must be same, subdomains can vary)
await fetch(url, {
  method: 'POST',
  credentials: 'same-origin', // <- required in order to send the authorization token from cookie storage (the raw auth token in client-side-rendering, safe from the XSS vulnerabilities of the client)
  headers: {
    authorization: await getAuthorizationHeader({ storage }), // <- required in order to send the authorization token from local storage (anti-csrf token in client-side-rendering, the raw auth token in server-side-rendering)
  },
  body: JSON.stringify(event),
});

log a user out

import { forgetAuthenticationToken } from 'whodis-react';

await forgetAuthenticationToken({ storage }); // log the user out by forgetting their authentication token

nuances

browser storage

please see the documentation for whodis-react-storage-browser to learn about nuances with

  • cookie based authentication -vs- local development
  • server side rendering
0.9.0

21 days ago

0.8.8

7 months ago

0.8.5

8 months ago

0.8.4

8 months ago

0.8.7

7 months ago

0.8.6

7 months ago

0.0.2023071-7.1

10 months ago

0.0.828

10 months ago

0.0.827

10 months ago

0.0.821

10 months ago

0.0.202-3.7.17.1

10 months ago

0.0.825

10 months ago

0.0.823

10 months ago

0.8.1

10 months ago

0.6.3

11 months ago

0.8.0

10 months ago

0.6.2

11 months ago

0.8.3

8 months ago

0.6.5

11 months ago

0.8.2

8 months ago

0.6.4

11 months ago

0.7.0

11 months ago

0.6.1

11 months ago

0.6.0

11 months ago

0.5.0

1 year ago

0.5.2

1 year ago

0.5.1

1 year ago

0.4.0

2 years ago

0.3.2

3 years ago

0.3.1

3 years ago

0.3.3

3 years ago

0.3.0

3 years ago

0.2.0

3 years ago

0.1.12

3 years ago

0.1.11

3 years ago

0.1.10

3 years ago

0.1.8

3 years ago

0.1.9

3 years ago

0.1.7

3 years ago

0.1.6

3 years ago

0.1.4

3 years ago

0.1.5

3 years ago

0.1.3

3 years ago

0.1.2

3 years ago

0.1.1

3 years ago

0.1.0

3 years ago