Ainda estou tentando encontrar a melhor solução de segurança para proteger a API REST, porque a quantidade de aplicativos móveis e API está aumentando a cada dia.
Tentei diferentes formas de autenticação, mas ainda tenho alguns mal-entendidos, por isso preciso de conselhos de alguém mais experiente.
Deixe-me dizer, como eu entendo todas essas coisas. Se eu entender algo incorretamente, entre em contato.
Quanto à API REST é sem estado e WEB em geral, precisamos enviar alguns dados de autenticação em cada solicitação (cookies, token ...). Conheço três mecanismos amplamente utilizados para autenticar usuários
Token com HTTPS. Eu tenho usado essa abordagem muitas vezes, é boa o suficiente com HTTPS. Se o usuário fornecer a senha e o login corretos, ele receberá o token em resposta e o utilizará para as solicitações adicionais. O token é gerado pelo servidor e armazenado, por exemplo, na tabela separada ou a mesma onde as informações do usuário são armazenadas. Portanto, para cada servidor de solicitação, verifique se o usuário possui token e é o mesmo que no banco de dados. Tudo é bem direto.
Token JWT. Esse token é auto-descritivo, contém todas as informações necessárias sobre o próprio token, o usuário não pode alterar, por exemplo, data de validade ou qualquer outra reivindicação, porque esse token é gerado (assinado) pelo servidor com a palavra-chave secreta. Isso também está claro. Mas um grande problema, pessoalmente, para mim, como invalidar o token.
OAuth 2. Não entendo por que essa abordagem deve ser usada quando a comunicação é estabelecida diretamente entre servidor e cliente. Pelo que entendi, o servidor OAuth é usado para emitir token com escopo restrito para permitir que outros aplicativos acessem informações do usuário sem armazenar senha e logon. Esta é uma ótima solução para as redes sociais, quando o usuário deseja se inscrever em alguma página, o servidor pode solicitar permissões para obter informações do usuário, por exemplo, do twitter ou do facebook, preencher campos de registro com dados do usuário e assim por diante.
Considere o cliente móvel para a loja online.
Primeira pergunta: devo preferir o JWT ao invés do primeiro tipo de token? Na medida em que eu preciso de usuário de logon / logout no cliente móvel, preciso armazenar um token em algum lugar ou, no caso de JWT, o token deve ser invalidado no logout. Diferentes abordagens são usadas para invalidar o token, uma das é criar lista de tokens inválidos (lista negra). Hmm. A tabela / arquivo terá um tamanho muito maior do que se o token estivesse armazenado na tabela e associado ao usuário e apenas removido no logout.
Então, quais são os benefícios do token JWT?
Segunda pergunta sobre o OAuth, devo usá-lo em caso de comunicação direta com meu servidor? Qual é o objetivo de mais uma camada entre cliente e servidor apenas para emitir token, mas a comunicação não será com o servidor oauth, mas com o servidor principal. Pelo que entendi, o servidor OAuth é responsável apenas por conceder permissões (tokens) a aplicativos de terceiros para acessar informações privadas do usuário. Mas meu aplicativo cliente móvel não é de terceiros.