Skip to main content

react-native-auth

@rnx-kit/react-native-auth provides a cross-app uniform API for user authentication.

Install

Add the dependency to your project:

npm add @rnx-kit/react-native-auth

If you're using a different manager, swap out npm with your package manager of choice.

Usage

import {
acquireTokenWithScopes,
isAvailable,
} from "@rnx-kit/react-native-auth";

const scopes = ["user.read"];
const userPrincipalName = "arnold@contoso.com";

if (isAvailable()) {
const result = await acquireTokenWithScopes(
scopes,
userPrincipalName,
"MicrosoftAccount"
);
} else {
// Use an alternate authentication method
}
CategoryType NameDescription
typesAccountTypeAccount types. Current valid types are Microsoft accounts (or MSA) and organizational (M365), but can be extended to support other types, e.g. Apple, Google, etc.
typesAuthErrorAndroidThe authentication error object contains a stack trace on Android.
typesAuthErrorIOSThe authentication error object contains a stack trace on iOS.
typesAuthErrorNativeThe authentication error object. May contain a native stack trace.
typesAuthErrorTypeThe type of error that occurred during authentication.
typesAuthErrorUserInfoAuthentication error details provided by the underlying implementation. This object can be used to provide the inner exception, or a more user friendly error message.
typesAuthResultAuthentication result returned on success.
CategoryFunctionDescription
-acquireTokenWithResource(resource, userPrincipalName, accountType)Acquires a token for a resource.
-acquireTokenWithScopes(scopes, userPrincipalName, accountType)Acquires a token with specified scopes.
-isAvailable()Returns whether this module is available.

Motivation

Many features we build require authentication. The tricky thing about authentication in brownfield apps (i.e. a native app hosting a React Native instance) is that we want to reuse the auth code that the hosting app already has to access the keychain and enable single sign-on. This excludes the use of most React Native auth libraries out there since they are more geared towards standalone use. Additionally, all apps implement this in different ways, so most feature teams implement their own solution for providing access tokens to their features during the development loop, or they rely on their hosting app to provide such a solution. Solutions are often custom-made for the current app and cannot be shared with others without significant effort. They will also have to duplicate this effort when integrating into other apps.

This module aims to define a standard way to acquire access tokens so that React Native feature authors no longer have to care about the underlying implementations. The idea is that by abstracting away the implementation details, React Native features can more easily be integrated into any app that provides an implementation of this module, without having to duplicate the effort of others.