Estoy diseñando una API REST usando autorización / autenticación a través de una clave API.
Traté de averiguar cuál es el mejor lugar y descubrí que muchas personas sugieren usar un encabezado HTTP personalizado como ProjectName-Api-Key
, por ejemplo:
ProjectName-Api-Key: abcde
pero también es posible e ideológicamente correcto usar el Authorization
encabezado con un esquema personalizado, por ejemplo:
Authorization: ApiKey abcde
Por otro lado, encontré la consideración de que un esquema de Autorización personalizado puede ser inesperado y no admitido por algunos clientes y de todos modos conduce a un código personalizado, por lo que es mejor usar un encabezado personalizado ya que los clientes no tienen expectativas al respecto.
¿De qué manera preferirías enviar una clave API?
rest
api
authentication
authorization
headers
RomanG
fuente
fuente
Authorization: Bearer <token>
encabezado y nunca hubo un solo problema con eso. Los tokens son JWT s.Bearer
esquema se usa exclusivamente con oAuth2. Aplicarlo por separado de oAuth suena como un mal uso. ¿Por qué es correcto usar este esquema si no hay oAuth? Por cierto, tuve problemas para elegir un tipo de autorización para mi API. La API estará disponible solo para un servicio confiable, por lo que investigué el flujo de credenciales del cliente de oAuth2 y no he encontrado ningún beneficio en comparación con ApiKey en mi caso.ApiKey
se renombraba e interpretaba comoAccess Token
otorgada al cliente sin un tiempo de vencimiento. Es un tipo de aspecto filosófico, decidí no aportar definiciones complejas si mi caso puede describirse en términos simples y decidí llamarlo simplemente "ApiKey". Si su protocolo implementa el estándar oAuth, puedo aceptar usarloBearer
, pero no lo hace, supongo que este esquema no puede aplicarse.Respuestas:
Si usa Autorización, sea consistente
Algunos argumentarán que lo siguiente es innecesario ( y no hace mucho tiempo hubiera estado de acuerdo con ellos ) pero, en estos días, si usamos el
Authorization
encabezado, deberíamos informar el tipo de token, porque las claves API no son autodescriptivas per se 1 .¿Por qué creo que es necesario y por qué creo que es importante? Porque hoy en día el soporte de diferentes protocolos de autenticación / autorización se ha convertido en algo imprescindible. Si planeamos usar el
Authorization
encabezado para todos estos protocolos, tenemos que hacer que nuestro servicio de autenticación sea consistente. La forma de comunicar qué tipo de token enviamos y qué protocolo de autorización se debe aplicar también debe ir en el encabezado.No me importaba esto, pero después de trabajar con aplicaciones cliente de aplicaciones cuyas actualizaciones no estaban garantizadas (móviles y sensores en su mayoría), comencé a hacerlo. Comencé a ser más cauteloso en la forma en que implemento la seguridad para poder expandirla sin molestar a los clientes y sin demasiado dolor en el lado del servidor.
Preocupaciones
Los problemas que enfrenté al implementar mis propios esquemas han sido similares a los comentados.
Diga clientes , diga bibliotecas, marcos, servidores proxy inversos .
Ventajas
Una ventaja importante es el caché. Las cachés compartidas no almacenarán en caché el encabezado (y eso es bueno, por supuesto) a menos que usted indique lo contrario.
Entonces, ¿autorización o encabezado personalizado?
Según mi experiencia, implementar mi propio
Authorization
esquema me ha llevado la misma cantidad de trabajo (o más) que implementar encabezados de autorización personalizados, con la ligera diferencia de tener más libertad de diseño y más control sobre el caché cuando he usado encabezados personalizados. La razón es bastante estúpida, la mayoría de las veces tengoCache-control
configuradano-cache
ono-store
, lo que me permite hacer que las llamadas al servidor sean más deterministas (esto es importante cuando se trata de rastrear y probar) independientemente de la topología de la red.1: Creo que esta respuesta es muy clara con respecto a las claves API
fuente
X-
está en desuso a partir de 2012: stackoverflow.com/a/3561399/923720