@keycloak-react/web

React bindings for Keycloak javascript adapter

Usage no npm install needed!

<script type="module">
  import keycloakReactWeb from 'https://cdn.skypack.dev/@keycloak-react/web';
</script>

README

React Keycloak

React Keycloak

React bindings for Keycloak

NPM (scoped)

License lerna Contributors Gitter

Dependencies Build Status Coverage Status Github Issues


Table of Contents


Install

React Keycloak requires:

  • React 16.0 or later
  • keycloak-js 9.0.2 or later
yarn add @keycloak-react/web

or

npm install --save @keycloak-react/web

or as a UMD package through unpkg

Support

version keycloak-js version
v2.0.0+ 9.0.2+
v1.x >=8.0.2 <9.0.2

Getting Started

Setup Keycloak instance

Create a keycloak.js file in the src folder of your project (where App.js is located) with the following content

import Keycloak from 'keycloak-js'

// Setup Keycloak instance as needed
// Pass initialization options as required or leave blank to load from 'keycloak.json'
const keycloak = new Keycloak()

export default keycloak

Setup KeycloakProvider

Wrap your App inside KeycloakProvider and pass the keycloak instance as prop

import { KeycloakProvider } from '@keycloak-react/web'

import keycloak from './keycloak'

// Wrap everything inside KeycloakProvider
const App = () => {
  return <KeycloakProvider keycloak={keycloak}>...</KeycloakProvider>
}

N.B. If your using other providers (such as react-redux) it is recommended to place them inside KeycloakProvider.

KeycloakProvider automatically invokes keycloak.init() method when needed and supports the following props:

  • initConfig, contains the object to be passed to keycloak.init() method, by default the following is used

    {
      onLoad: 'check-sso',
      promiseType: 'native',
    }
    

    for more options see Keycloak docs.

  • LoadingComponent, a component to be displayed while keycloak is being initialized, if not provided child components will be rendered immediately. Defaults to null

  • isLoadingCheck, an optional loading check function to customize LoadingComponent display condition. Return true to display LoadingComponent, false to hide it.

    Can be implemented as follow

    ;(keycloak) => !keycloak.authenticated
    
  • onEvent, an handler function that receives events launched by keycloak, defaults to null.

    It can be implemented as follow

    ;(event, error) => {
      console.log('onKeycloakEvent', event, error)
    }
    

    Published events are:

    • onReady
    • onAuthSuccess
    • onAuthError
    • onAuthRefreshSuccess
    • onAuthRefreshError
    • onTokenExpired
    • onAuthLogout
  • onTokens, an handler function that receives keycloak tokens as an object every time they change, defaults to null.

    Keycloak tokens are returned as follow

    {
      "idToken": string,
      "refreshToken": string,
      "token": string
    }
    

HOC Usage

When a component requires access to Keycloak, wrap it inside the withKeycloak HOC.

import { withKeycloak } from '@keycloak-react/web'

const LoginPage = ({ keycloak, keycloakInitialized }) => {
  // Here you can access all of keycloak methods and variables.
  // See https://www.keycloak.org/docs/latest/securing_apps/index.html#javascript-adapter-reference
  return (
    <div>
      <button type="button" onClick={() => keycloak.login()}>
        Login
      </button>
    </div>
  )
}

export default withKeycloak(LoginPage)

Hook Usage (React >=16.8 required)

Alternately, when a component requires access to Keycloak, you can also use the useKeycloak Hook.

import { useKeycloak } from '@keycloak-react/web'

export default () => {
  // Using array destructuring
  const [keycloak, initialized] = useKeycloak()
  // or Object destructuring
  const { keycloak, initialized } = useKeycloak()

  // Here you can access all of keycloak methods and variables.
  // See https://www.keycloak.org/docs/latest/securing_apps/index.html#javascript-adapter-reference

  return (
    <div>
      <div>{`User is ${
        !keycloak.authenticated ? 'NOT ' : ''
      }authenticated`}</div>

      {!!keycloak.authenticated && (
        <button type="button" onClick={() => keycloak.logout()}>
          Logout
        </button>
      )}
    </div>
  )
}

External Usage (Advanced)

If you need to access keycloakΒ instance from non-React files (such as sagas, utils, providers ...), you can import the instance directly from the keycloak.js file.

The instance will be initialized by react-keycloak but you'll need to be carefull when using the instance and avoid setting/overriding any props, you can however freely access the exposed methods (such as refreshToken, login, etc...).

Examples

See inside examples for various demo implementing this library main features.

Note: The demo apps are not meant to be production-ready nor starter-kit s but just a way to show this module components and their usage.

Contributors

Thanks goes to these wonderful people (emoji key):


Mattia Panzeri

πŸ€” πŸ’» πŸ“– πŸ› 🚧 πŸ“¦ πŸ’¬ πŸ‘€ ⚠️ πŸ’‘

JannesD

πŸ› πŸ’»

This project follows the all-contributors specification. Contributions of any kind welcome!


If you found this project to be helpful, please consider buying me a coffee.

buy me a coffee