1.9.1 • Published 8 months ago

@janiscommerce/oauth-native v1.9.1

Weekly downloads
-
License
-
Repository
-
Last release
8 months ago

@janiscommerce/oauth-native

Wrapper package to handle Janis OAuth module.

Coverage Status npm version

⚠️ Peer dependencies: You must install react-native-app-auth: "^6.2.0", react-native-inappbrowser-reborn: "^3.5.1" and @react-navigation/native: "^6.1.6" before using this package.

Installation

npm install @janiscommerce/oauth-native

Usage

Main Auth Provider

Wrap your app inside a AuthProvider component and pass required "config" and "logoutUrl" props. (to know more about config object, see react-native-app-auth docs)

// App.js - (Your main app component)
import AuthProvider from '@janiscommerce/oauth-native';

/**
 * Config example
 * more info about config in: https://github.com/FormidableLabs/react-native-app-auth
 */
const config = {
  issuer: '' /* Issuer url */,
  clientId: '' /* Client id */,
  redirectUrl: '' /* Redirect url */,
  scopes: ['openid', 'profile', 'email'] /* All scopes you need */,
  serviceConfiguration: {
    authorizationEndpoint: '' /* Authorization url */,
    tokenEndpoint: '' /* Token url */,
  },
};

const logoutUrl = 'https://example.com/logout'; /* Url to logout on webview */

const App = () => (
  <AuthProvider config={config} logoutUrl={logoutUrl}>
    <ChildrenComponent />
  </AuthProvider>
);

export default App;

Custom hook

Export any component that needs access to oauth or openId user data using useOauthData. By doing this, you'll have access to methods handleLogout or handleAuthorize, and some states.

// ChildrenComponent.js (Some internal component on your app)
import {useOauthData} from '@janiscommerce/oauth-native';

const ChildrenComponent = () => {
  const {isLogged, handleLogout, ...rest} = useOauthData();

  console.log('...rest', rest);

  return (
    <View>
      {isLogged ? (
        <View>
          <Text>User is logged</Text>
          <Button
            onPress={handleLogout}
            title="Cerrar Sesión"
            color="#841584"
          />
        </View>
      ) : (
        <View>
          <Text>User is NOT logged</Text>
        </View>
      )}
    </View>
  );
};

useOauthData returned states and methods:

stateTypedescription
oauthTokensobjectall tokens obtained from authentication server
handleLogoutfunctionopen a in App browser with logout url and clean async storage tokens
handleAuthorizefunctionopen a in App browser to authenticate user
userDataobjectuser data from openId Connect
isLoggedbooleaninfo about if user is logged
loadingboolean-
errornull or stringnull if there is no errors or string with error message

getUserInfo method

The method getUserInfo compared to useOauthData.userData is not context dependent.

stateTypedescription
getUserInfoobjectuser data information without depending on a context

withTokensExpirationAccess HOC

HOC that provides automatic token expiration handling to wrapped components. It monitors the access token and refreshes it if it's about to expire, ensuring the user session stays active without manual intervention as well as providing the option to alert the user some time before the token expires.

// SomeScreen.js
import {withTokensExpirationAccess} from '@janiscommerce/oauth-native';

const SomeScreen = () => {
  return (
    <View>
      <Text>Screen</Text>
    </View>
  );
};

export default withTokensExpirationAccess(SomeScreen, {
  onTokenNearExpiration: () =>
    Toast.show({text2: 'Token near expiration!', type: 'warning'}),
  onTokenExpired: () => console.log('Log out!'),
});

WithTokensExpirationAccess Configuration Options:

config optionTypeDescription
minutesToConsiderTokenAsExpirednumberNumber of minutes before the real expiration time at which the token should be considered expired. Defaults to 0, meaning expired at or after the exact expiration time. If the token is considered expired, onTokenExpired is called and the user is logged out.
minutesToConsiderTokenAsNearExpirationnumberNumber of minutes before the real expiration time to consider the token as near expiration. For onTokenNearExpiration to be triggered, this value must be a number and strictly greater than minutesToConsiderTokenAsExpired. Defaults to null, disabling the near expiration check. If the token is considered near expiration, onTokenNearExpiration is called.
onTokenNearExpirationfunctionCallback function triggered when the token is in the pre-expiration window (as defined by minutesToConsiderTokenAsNearExpiration and minutesToConsiderTokenAsExpired).
onTokenExpiredfunctionCallback function triggered when the token is considered expired (as defined by minutesToConsiderTokenAsExpired). Also logs the user out.

isTokenExpired method

The method isTokenExpired checks if the current token has expired by retrieving the expiration time from the cache.

// SomeComponent.js
import {useEffect} from 'react';
import {isTokenExpired} from '@janiscommerce/oauth-native';

const SomeComponent = () => {
  useEffect(() => {
    const checkTokenExpiration = async () => {
      const expired = await isTokenExpired();
      if (expired) {
        console.log('Token has expired');
      } else {
        console.log('Token is still valid');
      }
    };
    checkTokenExpiration();
  }, []);

  return <View>...</View>;
};
stateTypedescription
isTokenExpiredbooleantrue if token is expired, false if it is not or an error occurs
1.9.1

8 months ago

1.8.0

8 months ago

1.7.0

9 months ago

1.6.0

10 months ago

1.4.2

12 months ago

1.5.0

12 months ago

1.4.1

2 years ago

1.4.0

2 years ago

1.3.1

2 years ago

1.2.2

2 years ago

1.3.0

2 years ago

1.2.0

3 years ago

1.2.1

3 years ago

1.1.0

4 years ago

1.0.1

5 years ago

1.0.0

5 years ago