Estou projetando uma API REST usando autorização / autenticação por meio de uma chave de API.
Tentei descobrir qual é o melhor lugar para isso e descobri que muitas pessoas sugerem o uso de um cabeçalho HTTP personalizado, como ProjectName-Api-Key
, por exemplo:
ProjectName-Api-Key: abcde
mas também é possível e ideologicamente correto usar o Authorization
cabeçalho com um esquema personalizado, por exemplo:
Authorization: ApiKey abcde
Por outro lado, considerei que um esquema de Autorização personalizado pode ser inesperado e não suportado por alguns clientes e leva ao código personalizado de qualquer maneira, portanto, é melhor usar um cabeçalho personalizado, pois os clientes não têm expectativas sobre isso.
De que maneira você prefere enviar uma chave de API?
rest
api
authentication
authorization
headers
RomanG
fonte
fonte
Authorization: Bearer <token>
cabeçalho e nunca houve um único problema com isso. Os tokens são JWTs .Bearer
esquema é usado exclusivamente com oAuth2. A aplicação separada do oAuth soa como mau uso. Por que é correto usar esse esquema se não há oAuth? A propósito, tive problemas com a escolha de um tipo de autorização para minha API. A API estará disponível apenas para um serviço confiável; portanto, investiguei o fluxo de credenciais do cliente oAuth2 e não encontrei nenhum benefício em comparação com o ApiKey no meu caso.ApiKey
fosse renomeada e interpretada comoAccess Token
concedida ao cliente sem um prazo de validade. Esse é um tipo de aspecto filosófico, decidi não trazer definições complexas se meu caso puder ser descrito em termos simples e decidi chamá-lo apenas de "ApiKey". Se o seu protocolo implementar oAuth Standart, posso concordar em usá-Bearer
lo, mas não, acho que esse esquema não pode ser aplicado.Respostas:
Se você usa Autorização, seja consistente
Alguns argumentam que o seguinte é desnecessário ( e não muito tempo atrás, eu teria concordado com eles ), mas hoje em dia, se usarmos o
Authorization
cabeçalho, devemos informar o tipo do token, porque as chaves da API não são auto-descritivas por si só 1 .Por que eu acho que é necessário e por que eu acho que é importante? Porque hoje em dia o suporte a diferentes protocolos de autenticação / autorização se tornou um item obrigatório. Se planejamos usar o
Authorization
cabeçalho para todos esses protocolos, precisamos tornar nosso serviço de autenticação consistente. A maneira de comunicar que tipo de token enviamos e que protocolo de autorização deve ser aplicado também devem estar no cabeçalho.Eu não me importava com isso, mas depois de trabalhar com aplicativos clientes de aplicativos cujas atualizações não eram garantidas (principalmente celulares e sensores), comecei a fazê-lo. Comecei a ser mais cauteloso na maneira de implementar a segurança para poder expandi-la sem mexer com os clientes e sem muita dor no lado do servidor.
Preocupações
Os problemas que enfrentei ao implementar meus próprios esquemas foram semelhantes aos comentados.
Digamos clientes , digamos bibliotecas, estruturas, proxies reversos .
Vantagens
Uma vantagem importante é o cache. Caches compartilhados não armazenam em cache o cabeçalho (e isso é bom, é claro), a menos que você diga o contrário.
Então, autorização ou cabeçalho personalizado?
Para minha experiência, implementar meu próprio
Authorization
esquema me levou a mesma quantidade de trabalho (ou mais) do que implementar cabeçalhos de autorização personalizados, com a pequena diferença de ter mais liberdade de design e mais controle sobre o cache quando usei cabeçalhos personalizados. O motivo é bastante estúpido, na maioria das vezes em que eu tenho oCache-control
conjuntono-cache
ouno-store
, permitindo que eu faça as chamadas para o servidor mais determinísticas (isso é importante quando se trata de rastreamento e teste), independentemente da topologia da rede.1: Acho esta resposta muito clara em relação às chaves de API
fonte
X-
está obsoleto em 2012: stackoverflow.com/a/3561399/923720