Estou desenvolvendo o aplicativo da web restful que usa alguma estrutura da web popular no backend, digamos (rails, sinatra, flask, express.js). Idealmente, quero desenvolver o lado do cliente com Backbone.js. Como deixo apenas meu lado do cliente javascript interagir com essas chamadas de API? Não quero que essas chamadas de API sejam públicas e sejam chamadas curl
ou simplesmente inserindo o link no navegador.
91
Respostas:
Como primeiro princípio, se sua API for consumida por seu cliente JS, você deve assumir que é público: um depurador JS simples coloca um invasor em uma posição, onde ele pode enviar uma solicitação idêntica byte a byte de um ferramenta de sua escolha.
Dito isso, se eu li sua pergunta corretamente, não é isso que você deseja evitar: O que você realmente não quer que aconteça é que sua API seja consumida (em uma base regular) sem que seu cliente JS esteja envolvido. Aqui estão algumas idéias sobre como, se não aplicar, pelo menos incentivar o uso do seu cliente:
Tenho certeza, sua API tem algum tipo de campo de autenticação (por exemplo, Hash computado no cliente). Se não, dê uma olhada nesta pergunta SO . Certifique-se de usar um salt (ou mesmo uma chave de API) que é fornecido ao seu cliente JS em uma sessão base de (aot hardcoded). Dessa forma, um consumidor não autorizado de sua API é forçado a trabalhar muito mais.
Ao carregar o cliente JS, lembre-se de alguns cabeçalhos HTTP (vem à mente o agente do usuário) e o endereço IP e peça uma reautenticação caso eles mudem, utilizando listas negras para os suspeitos do costume. Isso força o invasor a fazer seu dever de casa mais detalhadamente novamente.
No lado do servidor, lembre-se das últimas chamadas de API e, antes de permitir outra, verifique se a lógica de negócios permite a nova agora: Isso nega a um invasor a capacidade de concentrar muitas de suas sessões em uma sessão com seu servidor: Em combinação com as outras medidas, isso tornará o agressor facilmente detectável.
Posso não ter dito isso com a clareza necessária: considero impossível tornar completamente impossível para um agressor consumir seu serviço, mas você pode dificultar tanto que pode não valer a pena o incômodo.
fonte
Você deve implementar algum tipo de sistema de autenticação. Uma boa maneira de lidar com isso é definir algumas variáveis de cabeçalho esperadas. Por exemplo, você pode ter uma chamada de API de autenticação / login que retorna um token de sessão. Chamadas subsequentes para sua API esperarão que um token de sessão seja definido em uma variável de cabeçalho HTTP com um nome específico como 'your-api-token'.
Como alternativa, muitos sistemas criam tokens de acesso ou chaves que são esperados (como youtube, facebook ou twitter) usando algum tipo de sistema de conta API. Nesses casos, seu cliente teria que armazená-los de alguma maneira no cliente.
Em seguida, é simplesmente uma questão de adicionar uma verificação para a sessão em sua estrutura REST e lançar uma exceção. Se possível, o código de status (para ficar tranquilo) seria um erro 401.
fonte
Existe um padrão aberto agora chamado "JSON Web Token",
consulte https://jwt.io/ & https://en.wikipedia.org/wiki/JSON_Web_Token
fonte
Com licença, @MarkAmery e Eugene, mas está incorreto.
Seu aplicativo js + html (cliente) em execução no navegador PODE ser configurado para excluir chamadas diretas não autorizadas para a API da seguinte forma:
Durante a autenticação, um "token" é retornado.
Após a autenticação, apenas as chamadas API com o "token" de autenticação serão aceitas.
É claro que, neste estágio, apenas usuários autorizados que possuem a senha podem acessar a API, embora se eles forem programadores que estão depurando o aplicativo, eles podem acessá-lo diretamente para fins de teste.
Agora, para usar sua API, eles devem primeiro baixar o cliente e executá-lo em um navegador. Somente depois de receber o retorno de chamada com sucesso e a entrada do usuário em um curto período de tempo, a API aceitará as chamadas.
Portanto, você não precisa se preocupar com a possibilidade de ser um usuário não autorizado sem credenciais.
(O título da pergunta, 'Como faço para proteger chamadas de API REST' e, pela maior parte do que você diz, essa é sua principal preocupação, e não a questão literal de COMO sua API é chamada, mas por QUEM, correto? )
fonte
Defina uma var SESSION no servidor quando o cliente carrega pela primeira vez o seu
index.html
(oubackbone.js
etc.)Verifique esta var no lado do servidor em cada chamada de API.
PS esta não é uma solução de "segurança" !!! Isso é apenas para facilitar a carga em seu servidor para que as pessoas não abusem dele ou "hotlink" sua API de outros sites e aplicativos.
fonte
Aqui está o que eu faço:
Proteja a API com um cabeçalho HTTP com chamadas como X-APITOKEN:
Use variáveis de sessão em PHP. Tenha um sistema de login em vigor e salve o token do usuário nas variáveis de sessão.
Chame o código JS com Ajax para PHP e use a variável de sessão com curl para chamar a API. Dessa forma, se a variável de sessão não for definida, ela não chamará e o código PHP contém o token de acesso para a API.
fonte