Com a nova função de nuvem do firebase, decidi mudar alguns dos meus pontos de extremidade HTTP para o firebase. Tudo funciona muito bem ... Mas eu tenho o seguinte problema. Eu tenho dois pontos de extremidade criados por gatilhos HTTP (Cloud Functions)
- Um ponto de extremidade da API para criar usuários e retorna o token personalizado gerado pelo Firebase Admin SDK.
- Um ponto de extremidade da API para buscar certos detalhes do usuário.
Enquanto o primeiro ponto de extremidade estiver bom, mas para o meu segundo ponto de extremidade, gostaria de protegê-lo apenas para usuários autenticados. ou seja, alguém que tenha o token que eu gerei anteriormente.
Como faço para resolver isso?
Eu sei que podemos obter os parâmetros Header na função cloud usando
request.get('x-myheader')
mas existe uma maneira de proteger o terminal, assim como proteger o banco de dados em tempo real?
firebase
firebase-realtime-database
firebase-authentication
firebase-security
google-cloud-functions
spaceMonkey
fonte
fonte
Respostas:
Há um exemplo de código oficial para o que você está tentando fazer. O que ilustra é como configurar sua função HTTPS para exigir um cabeçalho de Autorização com o token que o cliente recebeu durante a autenticação. A função usa a biblioteca firebase-admin para verificar o token.
Além disso, você pode usar " funções de chamada " para facilitar muito esse clichê, se seu aplicativo puder usar as bibliotecas cliente do Firebase.
fonte
Conforme mencionado por @Doug, você pode usar
firebase-admin
para verificar um token. Eu configurei um exemplo rápido:No exemplo acima, eu também habilitei o CORS, mas isso é opcional. Primeiro, você obtém o
Authorization
cabeçalho e descobre otoken
.Em seguida, você pode usar
firebase-admin
para verificar esse token. Você receberá as informações decodificadas para esse usuário na resposta. Caso contrário, se o token não for válido, ocorrerá um erro.fonte
getIdToken()
método nos documentos do firebase do lado do cliente (por exemplo,firebase.auth().currentUser.getIdToken().then(token => console.log(token))
)Como também mencionado por @Doug, você pode usar as funções de chamada para excluir algum código padrão do seu cliente e servidor.
Função de chamada Exampale:
Pode ser chamado diretamente do seu cliente da seguinte maneira:
fonte
Os métodos acima autenticam o usuário usando a lógica interna da função, portanto a função ainda deve ser invocada para fazer a verificação.
Esse é um método totalmente bom, mas por uma questão de abrangência, existe uma alternativa:
Você pode definir uma função como "privada" para que não possa ser chamada, exceto por usuários registrados (você decide as permissões). Nesse caso, solicitações não autenticadas são negadas fora do contexto da função e a função não é invocada.
Aqui estão referências a (a) Configuração de funções como pública / privada e, em seguida, (b) autenticação de usuários finais às suas funções .
Observe que os documentos acima são para o Google Cloud Platform e, de fato, isso funciona porque todo projeto Firebase também é um projeto GCP. Uma ressalva relacionada a esse método é que, por escrito, ele funciona apenas com autenticação baseada em conta do Google.
fonte
Há um bom exemplo oficial usando o Express - pode ser útil no futuro: https://github.com/firebase/functions-samples/blob/master/authorized-https-endpoint/functions/index.js (colado abaixo, apenas com certeza)
Lembre-se de que
exports.app
disponibiliza suas funções sob/app
slug (nesse caso, existe apenas uma função e sob<you-firebase-app>/app/hello
. Para se livrar dela, é necessário reescrever um pouco a parte do Express (a parte do middleware para validação permanece a mesma - funciona muito bom e é bastante compreensível graças aos comentários).Minha reescrita para se livrar de
/app
:fonte
Eu tenho me esforçado para obter uma autenticação adequada da base de firmas na função golang GCP. Na verdade, não há exemplo para isso, então decidi criar esta pequena biblioteca: https://github.com/Jblew/go-firebase-auth-in-gcp-functions
Agora você pode autenticar facilmente os usuários usando o firebase-auth (que é diferente das funções gcp-authenticated) e não é diretamente suportado pelo proxy que reconhece a identidade).
Aqui está um exemplo de uso do utilitário:
Lembre-se de implantar sua função com
--allow-unauthenticated
sinalizador (porque a autenticação do firebase ocorre dentro da execução da função).Espero que isso ajude você, pois me ajudou. Eu estava determinado a usar golang para funções da nuvem por razões de desempenho - Jędrzej
fonte
No Firebase, para simplificar seu código e seu trabalho, é apenas uma questão de design de arquitetura :
Express
. Para restringir apenas o mesmo site ou site específico , useCORS
para controlar esse aspecto da segurança. Isso faz sentido porqueExpress
é útil para SEO devido ao seu conteúdo de renderização no servidor.context
parâmetro para salvar todos os aborrecimentos. Isso também faz sentido, porque, como um aplicativo de página única criado com o AngularJS - o AngularJS é ruim para o SEO, mas como é um aplicativo protegido por senha, você também não precisa muito do SEO. Quanto à modelagem, o AngularJS tem modelagem embutida, portanto, não há necessidade de modelo de corte comExpress
. As funções de chamada do Firebase devem ser boas o suficiente.Com o exposto, não há mais problemas e facilita a vida.
fonte