Fazer com que o fluxo de autenticação certo ao iniciar um novo projeto de desenvolvimento de aplicativo economiza muito tempo. Para esse fim, hoje, aprenderemos como criar um fluxo de autenticação reutilizável no React Native.

O objetivo deste tutorial é demonstrar como configurar um fluxo de autenticação básico, porém real, de ponta a ponta. O resultado será uma solução genérica que lida com a maioria dos casos de uso de autenticação que podemos facilmente copiar e colar em nosso próximo projeto.

Requisitos

Para seguir este tutorial, certifique-se de que sua configuração de dev inclui a seguinte configuração:

  • Versão do nó ≥10.x.x instalada
  • Um gerenciador de pacotes, como npm ou Yarn
  • react-native-cli instalado em sua máquina local

Observe que estamos usando a React Native versão 0.64.0 neste tutorial, então faça com que você esteja usando a versão ≥0.60.x.

Para obter um passo a passo completo sobre como configurar um ambiente de desenvolvimento para React Native em sua máquina local, você pode consultar a documentação oficial aqui .

Reagir configuração do projeto nativo

Agora criaremos um novo projeto React Native. Primeiro, criaremos um diretório para conter todo o nosso código e, em seguida, cd nesse diretório. Escolhemos RNauthflow como o nome do aplicativo e usaremos esse nome em todo o tutorial, mas você pode usar qualquer nome que desejar.

Execute este comando para criar os arquivos básicos do projeto e configuração:

 npx init nativo RNauthflow
# navegar para o diretório do projeto
cd RNauthflow

Assim que a configuração básica do projeto estiver concluída, podemos instalar todas as dependências necessárias para executar e construir o aplicativo de demonstração:

 # para navegação yarn add @ react-navigation/native @ react-navigation/stack react-native-reanimated react-native-gestos-handler react-native-screens react-native-safe-area-context @ react-native-community/masked-view

Vale a pena ler como usar o React Navigation em projetos React Native se você não está familiarizado. Para finalizar a instalação no iOS, você terá que instalar pods (NB, certifique-se de ter CocoaPods instalado para esta finalidade).

 cd ios/&& pod install
# uma vez instalada a dependência do pod
CD..
# para rodar no iOS
run-ios react-nativo
# para rodar no Android
react-nativo run-andriod

Criação de uma função de utilidade para armazenar tokens

Para armazenar o token aqui, estamos usando o pacote npm react-native-async-storage/async-storage .
No entanto, já existem soluções para as plataformas Android e iOS.

Para começar, primeiro instale react-native-async-storage/async-storage :

 yarn add @ react-native-async-storage/async-storage

Então, podemos implementar facilmente as funções de nossos auxiliares, como:

//arquivo async-storage.js
importar AsyncStorage de'@ react-native-async-storage/async-storage';
exportar função assíncrona getItem () { valor const=await AsyncStorage.getItem ('token'); valor de retorno ? JSON.parse (valor): nulo;
}
exportar função assíncrona setItem (valor) { return AsyncStorage.setItem ('token', JSON.stringify (value));
}
exportar função assíncrona removeItem () { return AsyncStorage.removeItem ('token');
}

Criação do contexto de autenticação

Observe que não estamos usando nenhuma biblioteca para gerenciar o estado do nosso projeto. Podemos usar qualquer biblioteca de gerenciamento de estado que quisermos, mas aqui usaremos a API React Context, que fornece uma maneira de compartilhar valores entre os componentes sem ter que passar explicitamente um prop em cada nível da árvore.

Primeiro, criamos um contexto de autenticação simples e implementamos os componentes do provedor. Nós
tem status , authToken , signIn e signOut em nosso contexto de autenticação. Estamos usando a abordagem useReducer para atualizar o estado, o que ajudará a tornar nosso código limpo e fácil de seguir.

Criamos nossas ações de autenticação com o gancho useMemo para memorizá-las. Essa otimização ajuda a evitar a geração de novas instâncias em cada renderização. Por último, encerramos nosso aplicativo usando o AuthProvider :

/**
* Arquivo AuthProvider.js
*
**/
import * as React from'react';
import { getItem as getToken, setItem as setToken, removeItem as removeToken,
} de'./async-storage';
const AuthContext=React.createContext ({ Status Ocioso', authToken: null, signIn: ()=> {}, signOut: ()=> {},
});
export const useAuthorization=()=> { contexto const=React.useContext (AuthContext); if (! contexto) { lance novo Error ('Error'); } contexto de retorno;
};
exportar const AuthProvider=props=> { const [estado, despacho]=React.useReducer (redutor, { Status Ocioso', authToken: null, }); React.useEffect (()=> { const initState=async ()=> { tentar { const authToken=await getToken (); if (authToken!==null) { despachar ({tipo:'SIGN_IN', token: authToken}); } senão { despachar ({tipo:'SIGN_OUT'}); } } catch (e) { console.log (e); } }; initState (); }, [estado, despacho]); ações const=React.useMemo ( ()=> ({ signIn: token assíncrono=> { despacho ({tipo:'SIGN_IN', token}); esperar setToken (token); }, signOut: async ()=> { despachar ({tipo:'SIGN_OUT'}); aguarde removeToken (); }, }), [estado, despacho], ); Retorna (  {props.children}  );
};
redutor const=(estado, ação)=> { switch (action.type) { case'SIGN_OUT': Retorna { ...Estado, status:'signOut', authToken: null, }; case'SIGN_IN': Retorna { ...Estado, status:'signIn', authToken: action.token, }; }
};

Adicionando telas e navegação

Vamos criar duas novas telas, HomeScreen e LoginScreen , dentro do diretório src/screens/. Este componente de tela será responsável por exibir uma tela de login caso o usuário não tenha se autenticado. Assim que o usuário for autorizado, ele poderá acessar a tela inicial.

Aqui, estamos usando o React Navigation v5. Ele segue uma abordagem mais baseada em componentes, usando um NavigatorContainer e uma instância de createStackNavigator :

/**
* Arquivo Home.js
*
*/
import * as React from'react';
importar {NavigationContainer} de'@ react-navigation/native';
importar {createStackNavigator} de'@ react-navigation/stack';
importar {HomeScreen, LoginScreen} de'../screens';
const Stack=createStackNavigator ();
export function Home () { Retorna (       );
}

Se verificarmos o aplicativo em um emulador ou dispositivo, devemos ver uma saída semelhante a esta:

Tela de login do fluxo de autenticação do React Native
A tela de login.
React Native Auth Flow Homepage
A tela inicial.

Para usar esta solução, precisamos envolver nosso componente Root (App) com AuthProvider e podemos começar a usar nosso fluxo de autenticação reutilizável.

 exportar função padrão App () { Retorna (    );
}

Conclusão

E aí está-criamos com sucesso um fluxo de autenticação genérico e reutilizável. Também aprendemos como configurar o React Navigation e usar sua abordagem baseada em componentes. Podemos prosseguir e implantar esse fluxo de autenticação reutilizável com Firebase, Okta, Auth0 e outros.

Por último, mas não menos importante, você pode encontrar o código completo usado nesta demonstração no repositório GitHub aqui .

A postagem Construindo um fluxo de autenticação reutilizável no React Native apareceu primeiro no LogRocket Blog .

Source link