Projektuję interfejs API REST przy użyciu autoryzacji / uwierzytelnienia za pomocą klucza API.
Próbowałem dowiedzieć się, jakie jest dla niego najlepsze miejsce i odkryłem, że wiele osób sugeruje użycie niestandardowego nagłówka HTTP, takiego jak ProjectName-Api-Key
np .:
ProjectName-Api-Key: abcde
ale także możliwe i ideologicznie poprawne jest użycie Authorization
nagłówka z niestandardowym schematem, np .:
Authorization: ApiKey abcde
Z drugiej strony odkryłem, że niestandardowy schemat autoryzacji może być nieoczekiwany i nieobsługiwany przez niektórych klientów i prowadzi do niestandardowego kodu, więc lepiej jest użyć niestandardowego nagłówka, ponieważ klienci nie mają żadnych oczekiwań w stosunku do niego.
W jaki sposób wolisz wysłać klucz API?
rest
api
authentication
authorization
headers
RomanG
źródło
źródło
Authorization: Bearer <token>
nagłówka i nigdy nie było z tym żadnego problemu. Tokenami są JWT .Bearer
schemat jest używany wyłącznie z oAuth2. Zastosowanie go osobno od oAuth brzmi jak niewłaściwe użycie. Dlaczego warto używać tego schematu, jeśli nie ma prawdy? Nawiasem mówiąc, miałem problemy z wyborem rodzaju autoryzacji dla mojego interfejsu API. Interfejs API będzie dostępny tylko dla jednej zaufanej usługi, więc zbadałem przepływ poświadczeń klienta oAuth2 i w moim przypadku nie znalazłem żadnych korzyści w porównaniu z ApiKey.ApiKey
zostanie zmieniona jej nazwa i zinterpretowana jakoAccess Token
udzielona klientowi bez upływu terminu ważności. Jest to rodzaj aspektu filozoficznego, postanowiłem nie wprowadzać skomplikowanych definicji, jeśli mój przypadek można opisać w prosty sposób, i postanowiłem po prostu nazwać go „ApiKey”. Jeśli Twój protokół implementuje standard oAuth, mogę zgodzić się na jego użycieBearer
, ale tak nie jest, chyba nie można zastosować tego schematu.Odpowiedzi:
Jeśli korzystasz z autoryzacji, zachowaj spójność
Niektórzy będą argumentować, że nie jest konieczne ( i nie tak dawno temu zgodziłbym się z nimi ), ale w dzisiejszych czasach, jeśli użyjemy
Authorization
nagłówka, powinniśmy poinformować o typie tokena, ponieważ klucze API same w sobie nie opisują 1 .Dlaczego uważam, że jest to konieczne i dlaczego uważam, że to ważne? Ponieważ obecnie obsługa różnych protokołów uwierzytelniania / autoryzacji stała się koniecznością. Jeśli planujemy używać
Authorization
nagłówka dla wszystkich tych protokołów, musimy zapewnić spójność naszej usługi uwierzytelniania. Sposób komunikowania się, jaki rodzaj tokena wysyłamy i jaki protokół autoryzacji należy zastosować, powinien również znaleźć się w nagłówku.Nie przejmowałem się tym, ale po pracy z aplikacjami klienckimi, których aktualizacje nie były gwarantowane (głównie telefony komórkowe i czujniki), zacząłem. Zacząłem być bardziej ostrożny w sposobie wdrażania zabezpieczeń, aby móc je rozszerzać bez bałaganu z klientami i bez nadmiernego bólu po stronie serwera.
Obawy
Problemy, z jakimi miałem do czynienia przy wdrażaniu własnych programów, były podobne do tych, które skomentowałem.
Powiedz klientom , powiedzmy biblioteki, frameworki, odwrotne proxy .
Zalety
Jedną ważną zaletą jest pamięć podręczna. Udostępnione pamięci podręczne nie buforują nagłówka (i to oczywiście dobrze), chyba że powiesz inaczej.
Więc autoryzacja czy niestandardowy nagłówek?
Z mojego doświadczenia
Authorization
wynika, że wdrożenie własnego schematu zajęło mi tyle samo pracy (lub więcej) niż wdrożenie niestandardowych nagłówków autoryzacji, z niewielką różnicą w zakresie większej swobody projektowania i większej kontroli nad pamięcią podręczną, gdy korzystam z niestandardowych nagłówków. Powód jest raczej głupi, przez większość czasu mamCache-control
ustawiony nano-cache
lubno-store
, co pozwala mi uczynić połączenia z serwerem bardziej deterministycznymi (jest to ważne, jeśli chodzi o śledzenie i testowanie) bez względu na topologię sieci.1: Uważam, że ta odpowiedź jest bardzo jasna w odniesieniu do kluczy API
źródło
X-
jest przestarzałe od 2012: stackoverflow.com/a/3561399/923720