Fundo:
Atualmente no processo de construção de uma API REST, usando o nó w / express e é consumido por um aplicativo móvel e, eventualmente, por um site (baseado em navegador moderno).
Estou tentando identificar a melhor maneira de autorizar a solicitação de atualização / ação de um usuário, para que eles só possam modificar seus próprios recursos. As ações ocorrerão a uma taxa semi-alta, daí a preocupação.
Nota: A propriedade das entidades não pode ser transferida neste caso de uso.
Soluções potenciais:
Solução : armazene e mantenha uma lista dos recursos de cada usuário em uma sessão do servidor apoiada por algo como reddis.
Preocupação (s) : A persistência de uma sessão do lado do servidor possui seu próprio conjunto de complexidades, dimensionadas especificamente com vários servidores. Isso também viola o REST. do-sessões-realmente-violar-restfulness para obter mais informações.
Solução: faça uma consulta de leitura antes da atualização / ação do usuário. O IE me fornece os itens deste usuário, se ele estiver na lista, continue com a atualização.
Preocupação (s): sobrecarga de uma leitura adicional toda vez que um usuário age em nome de um recurso.
Solução: passe o ID do usuário para a camada db e torne-o parte da atualização condicional ou, se desejar, use algo como a segurança no nível de linha do Postgres para esse recurso, dependendo do back-end de dados.
Preocupação (s): isso parece um pouco tardio no ciclo de vida da solicitação para verificar se o recurso é o usuário solicitante. O erro teria que ser lançado completamente do back-end de dados. Na mesma nota, também seria um pouco fora de lugar, considerando que a autenticação e a autorização baseada em função geralmente são feitas no início do ciclo de vida da solicitação. A implementação também depende do backend de dados. Ele também empurra a lógica de negócios no back-end de dados.
Solução: Sessão assinada do lado do cliente. Com um JWT ou um cookie criptografado / assinado. Manutenção essencial de uma sessão confiável contendo uma lista dos IDs de recursos do usuário.
Preocupação (s): O tamanho da sessão do lado do cliente. O fato de que ele seria enviado a cada solicitação, mesmo quando não for necessário. A manutenção se torna extremamente complexa quando você introduz a possibilidade de várias sessões / clientes ativos. Como você atualizaria o estado do lado do cliente quando um recurso foi adicionado em outro cliente.
Solução: passe um token de atualização assinado (JWT) ou URL para o cliente com o recurso quando o recurso for buscado. Espere que, quando um recurso seja atualizado / acionado. O token assinado conteria a identificação do usuário e a identificação do recurso e você poderá verificar facilmente com relação a elas.
Preocupação (s): fica complexa se a propriedade do recurso for transferível, mas no meu caso isso não é uma preocupação. Introduz complexidade sobre uma leitura antes da atualização. É um pouco estranho?
Pensamentos finais:
Estou me inclinando para a última solução, mas como não vejo isso acontecer com muita frequência, fico imaginando se estou perdendo alguma coisa. ou talvez seja parte de um padrão de design que eu não conheço.