React Native Auth¶
Librería de autenticación multiprovider para React Native que permite autenticarte con diferentes proveedores.
Internamente utiliza react-native-auth-app como librería principal para llevar a cabo los diferentes interraciones de autenticación.
Pre requisitos¶
Necesita tener instaladas las siguientes dependencias:
{
"react-native-app-auth": ">=6.4.3",
"jwt-decode": ">=3.1.2",
"@react-native-async-storage/async-storage": ">=1.21.0",
"react": ">=18.2.0",
"react-dom": ">=18.2.0",
"react-native": ">=0.71.11",
}
Instalación¶
yarn add @architecture-it/react-native-auth
Features¶
Entre las funcionalidades que la librería proporciona se encuentran:
- Login.
- Logout.
- Edición de perfil para provider Azure AD B2C.
- Refresh token.
- Sesión activa: si la sesión no fue cerrada al volver a ingresar a la aplicación ésta se mantiene abierta.
Configuración¶
Para poder utilizar la librería, es necesario declarar ciertas variables de entorno y agregar un archivo de configuración. Los pasos a seguir, se mencionan a continuación:
1. Variables de entorno¶
Para los providers disponibilizados (Azure B2C, Duende Software, Google), las variables de entorno principales son las mismas, la unica diferencia se presenta si se requiere utilizar B2C o Google, para lo cual va a ser necesario agregar variables extras como se muestra a continuación:
REACT_NATIVE_AUTH_CLIENT_ID: "interactive.public"
REACT_NATIVE_AUTH_DOMAIN: "https://demo.duendesoftware.com/"
REACT_NATIVE_AUTH_REDIRECT_URI: "io.identityserver.demo:/oauthredirect"
REACT_NATIVE_AUTH_SCOPES: "openid;profile;email;offline_access"
REACT_NATIVE_AUTH_PROVIDER: "IdentityServer"
REACT_NATIVE_AUTH_CLIENT_ID: client-id
REACT_NATIVE_AUTH_DOMAIN: "https://andreanib2cdev.b2clogin.com/andreanib2cdev.onmicrosoft.com/"
REACT_NATIVE_AUTH_REDIRECT_URI: "package-name://oauth/redirect/"
REACT_NATIVE_AUTH_SCOPES: "openid;profile;email;offline_access"
REACT_NATIVE_AUTH_PROVIDER: "B2C"
REACT_NATIVE_AUTH_SIGN_UP_SIGN_IN: "B2C_1A_SIGNUP_SIGNINAAD"
REACT_NATIVE_AUTH_FORGOT_PASSWORD: "B2C_1A_PASSWORDRESET"
REACT_NATIVE_AUTH_EDIT_PROFILE: "B2C_1A_PROFILEEDIT"
REACT_NATIVE_AUTH_CLIENT_ID: "client-id.apps.googleusercontent.com"
REACT_NATIVE_AUTH_DOMAIN: "https://accounts.google.com/"
REACT_NATIVE_AUTH_REDIRECT_URI: "com.googleusercontent.apps.client-id:/oauth2redirect/google"
REACT_NATIVE_AUTH_SCOPES: "openid;profile;email;offline_access"
REACT_NATIVE_AUTH_PROVIDER: "Google"
REACT_NATIVE_AUTH_TOKEN: "https://oauth2.googleapis.com/token"
REACT_NATIVE_AUTH_REVOKE: "https://oauth2.googleapis.com/revoke"
REACT_NATIVE_AUTH_AUTH: "https://accounts.google.com/o/oauth2/v2/auth"
2. Account Context¶
Se deberá agregar en la aplicación un archivo AccountContext.tsx
donde se conformará el objeto de variables que se utilizarán para configurar el provider de autenticación.
Con estas configuraciones, se creará una nueva instancia de autenticación que se usará para crear un nuevo contexto para el provider que está disponibilizado desde la librería.
El archivo que se deberá agregar contendrá el siguiente código:
import { createContext } from "react";
// La importación e implementación de las variables de entorno, se pueden utilizar con la metodología elegida (por ejemplo utilizar la librería react-native-dotenv o react-native-config)
import {
REACT_NATIVE_AUTH_CLIENT_ID,
REACT_NATIVE_AUTH_DOMAIN,
REACT_NATIVE_AUTH_REDIRECT_URI,
REACT_NATIVE_AUTH_SCOPES,
REACT_NATIVE_AUTH_PROVIDER,
REACT_NATIVE_AUTH_SIGN_UP_SIGN_IN,
REACT_NATIVE_AUTH_FORGOT_PASSWORD,
REACT_NATIVE_AUTH_EDIT_PROFILE,
} from "@env";
import { AuthHandler, IVariables, config, IAccountContext } from "@architecture-it/react-native-auth";
export const variables: IVariables = {
clientId: REACT_NATIVE_AUTH_CLIENT_ID,
authorityDomain: REACT_NATIVE_AUTH_DOMAIN,
redirectUri: REACT_NATIVE_AUTH_REDIRECT_URI,
scopes: REACT_NATIVE_AUTH_SCOPES,
provider: REACT_NATIVE_AUTH_PROVIDER,
// El siguiente objeto se debe agregar SÓLO SÍ el provider a utilizar es B2C
customPolicies: {
signUpSignIn: REACT_NATIVE_AUTH_SIGN_UP_SIGN_IN,
forgotPassword: REACT_NATIVE_AUTH_FORGOT_PASSWORD,
editProfile: REACT_NATIVE_AUTH_EDIT_PROFILE,
},
// El siguiente objeto se debe agregar SÓLO SÍ el provider a utilizar es Google
serviceConfiguration: {
authorizationEndpoint: REACT_NATIVE_AUTH_ENDPOINT,
tokenEndpoint: REACT_NATIVE_AUTH_TOKEN,
revocationEndpoint: REACT_NATIVE_AUTH_REVOKE,
},
};
export const configurations = config(variables);
export const authInstance = AuthHandler.createInstance(configurations);
/**
* Context to keep and share account info inside app
*/
export const AccountContext = createContext<IAccountContext>({
instance: authInstance,
handleSignOut: () => {},
});
Warning
La propiedad customPolicies
del objeto de variables es opcional y sólo deberá agregarse de forma obligatoria si se desea configurar Azure AD B2C como provider de autenticación, caso contrario no se debe agregar. Lo mismo para la propiedad serviceConfiguration
, que sólo será obligatoria si el provider de autenticación es Google.
3. Provider¶
Para poder terminar de configurar la librería de autenticación, es necesario agregar el provider que permitirá extender el contexto y la instancia previamente creada a lo largo de toda la aplicación.
A nivel root de la aplicación App.tsx
se deberá agregar el provider cómo se muestra a continuación:
// ... other imports
import { AccountProvider } from "@architecture-it/react-native-auth";
import { AccountContext, authInstance } from "./AccountContext";
function App(): JSX.Element {
return (
<AccountProvider AccountContext={AccountContext} instance={authInstance}>
{/* rest of the code */}
</AccountProvider>
);
}
export default App;
appAuthRedirectScheme¶
En la aplicación Android, se deberá configurar el redirect schema correspondiente.
En el archivo build.gradle que se encuentra en android/app/build.gradle
, dentro de la sección de defaultConfig, agregar lo siguiente:
manifestPlaceholders = [
appAuthRedirectScheme: 'mi-redirect-uri',
]
Uso¶
Una vez realizadas las configuraciones mencionadas previamentes, ya debería ser posible consumir y utilizar las diferentes funcionalidades que proporciona la librería.
useAccountContext¶
Se disponibiliza el hook useAccountContext
que permite acceder a la instancia de autenticación creada.
Algunos de los métodos disponibles para utilizar son los siguientes:
- getAuthState: información de la sesión del usuario.
- getIsLogged: indica si la sesión del usuario está activa o no.
- handleAuthorize: permite iniciar el flujo de inicio de sesión.
- handleLogout: cierra la sesión.
- handleProfileEdit: permite editar los datos del perfil, para usuarios de Azure AD B2C.
- handleRefresh: refresca el token de la sesión.
- handleRevoke: revoca el token de la sesión, se debe utilizar como cierre de sesión si el provier es Google.
A continuación un ejemplo de uso:
// ... other imports
import { AccountContext } from "../../AccountContext";
import { useAccountContext } from "@architecture-it/react-native-auth";
const Login = () => {
const { instance } = useAccountContext(AccountContext);
return (
<View>
<Button title="Login" onPress={() => instance.handleAuthorize()} />
</View>
);
};
export default Login;
Session hooks¶
La librería automáticamente setea y limpia la instancia de autenticación y la sesión del usuario en el storage al iniciar y cerrar sesión respectivamente.
Se otorga acceso a los tres métodos utilizados que permiten administrar la sesión del usuario en el storage, la cual se encuentra configurada bajo la key "session".
- setSession()
- getSession()
- clearSession()