Mam interfejs API, który wykorzystuje oAuth2 i własne aplikacje mobilne, które używają tego interfejsu API jako zaplecza. Ponieważ użytkownicy mogą być zalogowani jednocześnie za pomocą wielu urządzeń (np. IPhone'a, iPada, tabletu z Androidem lub telefonu z Androidem), potrzebuję interfejsu API do rozróżnienia każdego połączenia. Chciałbym to zrobić za pomocą oddzielnych tokenów dostępu: każdy klient otrzymuje osobny token dostępu.
Problem polega na tym, że bieżąca implementacja, której używamy (spring-security-oauth2) generuje unikalny klucz na podstawie id_klienta, nazwy użytkownika i zakresu. Zasadniczo więc, gdy otrzymujesz token dostępu, wszyscy klienci otrzymują ten sam token dostępu dla tego samego użytkownika. Odbywa się to za pomocą DefaultAuthenticationKeyGenerator.
Czy bezpiecznie jest zignorować generator kluczy uwierzytelniania i po prostu utworzyć nowy token dostępu na każde żądanie klienta?
AuthenticationKeyGenerator
interfejs. Czy możesz stworzyć własną implementację i użyć jej zamiast tego?Odpowiedzi:
Wiosenna chmura zapewnia już takie zachowanie. Po prostu dodaj różnych klientów. Podobnie jak iosAppClient, androidAppClient w twojej klasie AuthorizationServerConfiguration.
W backendie możesz uzyskać identyfikator klienta w następujący sposób
i zaimplementuj różne zachowania w zależności od clientId.
źródło
Jedna odpowiedź jest taka, że każda platforma aplikacji jest innym klientem, więc powinien mieć inny identyfikator klienta. Jeden dla aplikacji na iOS, jeden dla strony internetowej itp.
Jeśli chodzi o rozróżnienie między powiedzmy iPadem a iPhonem, proponuję nie polegać na tym w systemie OAuth.
źródło
Natknąłem się na ten sam problem podczas programowania backendu z Spring Boot i OAuth2. Problem, z którym się spotkałem, polegał na tym, że jeśli wiele urządzeń współużytkuje te same tokeny, gdy jedno urządzenie odświeży token, drugie urządzenie będzie pozbawione pojęcia i, mówiąc krótko, oba urządzenia weszły w szał odświeżania tokena. Moim rozwiązaniem było zastąpienie domyślnej
AuthenticationKeyGenerator
niestandardową implementacją, która zastępujeDefaultAuthenticationKeyGenerator
i dodaje nowy parametrclient_instance_id
w mieszaninie generatorów kluczy. Następnie moi klienci mobilni wysyłaliby ten parametr, który musi być unikalny dla wszystkich instalacji aplikacji (iOS lub Android). Nie jest to szczególny wymóg, ponieważ większość aplikacji mobilnych już śledzi instancję aplikacji w jakiejś formie.które następnie wstrzyknąłbyś w podobny sposób:
Żądanie HTTP wyglądałoby wtedy mniej więcej tak
Zaletą korzystania z tego podejścia jest to, że jeśli klient nie wyśle a
client_instance_id
, zostanie wygenerowany klucz domyślny, a jeśli wystąpi instancja, ten sam klucz jest zwracany za każdym razem dla tej samej instancji. Ponadto klucz jest niezależny od platformy. Minusem byłoby to, że skrót MD5 (używany wewnętrznie) jest wywoływany dwa razy.źródło