Como armazenar um token de autenticação em um aplicativo Angular

Eu tenho um aplicativo Angular (SPA) que se comunica com um servidor de API REST e estou interessado em descobrir o melhor método para armazenar um token de acesso retornado de um servidor de API para que o cliente Angular possa usá-lo para autenticar solicitações futuras para a API. Por motivos de segurança, eu gostaria de armazená-lo como uma variável de sessão do navegador para que o token não permaneça após o fechamento do navegador.

Estou implementando uma versão ligeiramente personalizada do OAuth 2.0 usando a concessão de senha do proprietário do recurso. O aplicativo Angular fornece um formulário para o usuário digitar seu nome de usuário e senha. Essas credenciais são enviadas para a API em troca de um token de acesso que deve ser enviado como um cabeçalho (Autorização: Portador% Token%) para todas as solicitações de saída da API, para que possa autorizar solicitações para outras rotas.

Sou bastante novo no domínio do Angular, mas o fluxo de trabalho que gostaria de implementar na manipulação desses tokens está resumido a seguir.

1) O cliente faz uma solicitação para a API, fornecendo-lhe credenciais.

2) Se essa solicitação for bem-sucedida, o token será armazenadoalgum lugar (onde está a questão)

3) Intercepte solicitações HTTP. Se o token estiver definido, passe-o como um cabeçalho para a API

4) O token é destruído quando o navegador / guia é fechado.

Conheço ofertas Angular$ window.sessionStorage, que parece ser o que estou procurando, mas estou preocupado com o potencial de ele não funcionar em todos os navegadores de acordo com os vários recursos que li. Este é um aplicativo de nível empresarial e deve ser compatível com uma ampla variedade de navegadores (IE, Chrome, Firefox). Posso usar isso com segurança, com a confiança de que será estável?

As alternativas, pelo que entendi, são $ window.localStorage ou cookies ($ cookies, $ cookieStore). Isso não seria uma solução ideal para mim, pois não quero que esses dados persistam, mas se for mais confiável, terei que sacrificar a eficiência pela compatibilidade. Eu também estava pensando que seria possível simplesmente defini-lo como um valor no $ rootScope e referenciá-lo dessa maneira, mas não tenho certeza se isso é viável.

Espero que tudo tenha sentido. Qualquer ajuda / sugestão seria muito apreciada. Obrigado!

questionAnswers(2)

yourAnswerToTheQuestion