Spring OAuth 2 Facebook

Spring OAuth 2 Facebook
D2
  • Rejestracja:około 6 lat
  • Ostatnio:około 3 lata
  • Postów:26
0

Witam, mam dwie apki, Angular + Spring Boot, które komunikują się za pomocą REST API.

W springu zaimplementowałem już Security (poprzez JWT) i teraz chcę umożliwić logowanie się za pomocą Facebooka.
Po stronie Angulara używam FB SDK, które po zalogowaniu zwraca mi token.
Chcę ten token wysłać jak zwykłe JWT w nagłówku Authorization i walidować przed wejściem w zabezpieczony endpoint.

Nie chcę tworzyć ze Springa Clienta OAuth ale chcę żeby występował w roli resource server.
Nie chcę też używać Keycloak etc.

Czy takie rozwiązanie jest możliwe ?
Proszę o nakierowanie mnie na jakiś trop bo obecnie można tak powiedzieć, że zbłądziłem jak to rozwiązać :D
Z góry dzięki !

Bambo
  • Rejestracja:ponad 10 lat
  • Ostatnio:8 miesięcy
  • Postów:779
2

Jak masz token z FB to wyślij go na serwer, tam uderz po jakieś profile/me do FB, dostaniesz profil z fb, odpowiednio przygotowujesz z niego jakieś UserAuthData bądź co tam dokładnie trzymasz, zapisujesz/mergujesz z istniejącym w DB (może ktoś już się logował przez google lub customowo) i dalej normalnie zwracasz JWT w headerze czy tam body. Endpoint który wystawisz w Spring Boocie (ten co przyjmuje token z fb) jest normalnie publiczny.

edytowany 2x, ostatnio: Bambo
PI
  • Rejestracja:ponad 9 lat
  • Ostatnio:4 miesiące
  • Postów:2787
0
dobrzyn227 napisał(a):

Nie chcę tworzyć ze Springa Clienta OAuth ale chcę żeby występował w roli resource server.

Nie wiem czy coś mylę, ale IMO, jeśli chodzi o koncepcję, to resource serverem będzie tak czy siak Facebook... czy się mylę?

Charles_Ray
Nie no, resource server to backend, który serwuje chronione zasoby :)
Skoq
no to fejs nie będzie właśnie tym resource serverem? wysyłamy token z żądaniem a on albo zwraca nam dane np. z profilu albo nie
Charles_Ray
  • Rejestracja:około 17 lat
  • Ostatnio:około 23 godziny
  • Postów:1875
1

Nie rozumiem, w jaki sposób Twój backend ma wiedzieć, że jesteś uwierzytelniony w Facebooku? Może masz zaimplementowany jakiś inny grant flow?

Spójrz tutaj: https://www.callicoder.com/spring-boot-security-oauth2-social-login-part-1/


”Engineering is easy. People are hard.” Bill Coughran
nowyworek
  • Rejestracja:prawie 5 lat
  • Ostatnio:ponad 4 lata
  • Lokalizacja:świat
  • Postów:174
0

@EnableOauth2Sso na konfiguracji security


Julian
D2
  • Rejestracja:około 6 lat
  • Ostatnio:około 3 lata
  • Postów:26
0
Bambo napisał(a):

Jak masz token z FB to wyślij go na serwer, tam uderz po jakieś profile/me do FB, dostaniesz profil z fb, odpowiednio przygotowujesz z niego jakieś UserAuthData bądź co tam dokładnie trzymasz, zapisujesz/mergujesz z istniejącym w DB (może ktoś już się logował przez google lub customowo) i dalej normalnie zwracasz JWT w headerze czy tam body. Endpoint który wystawisz w Spring Boocie (ten co przyjmuje token z fb) jest normalnie publiczny.

Tak właśnie chciałem zrobić, spróbowałem po Twojej odpowiedzi z biblioteką Spring Social, lecz zorientowałem się że nie jest już wspierana i została zastąpiona spring-security-oauth2-client i to mnie skłoniło żeby może pomyśleć czy takie flow jakie założyłem na początku jest poprawne. Żeby łatwiej zobrazować to o czym mówię to poniższy obrazek przedstawia flow, które chcę osiągnąć i nie wiem czy jest ono poprawne czy nie...
https://www.google.com/url?sa=i&url=https%3A%2F%2Fstackoverflow.com%2Fquestions%2F51883664%2Fangular-ts-front-end-spring-boot-back-end-oauth2-flow&psig=AOvVaw05KFwFUmLBA3B1DOl9SPqZ&ust=1598990247204000&source=images&cd=vfe&ved=0CAIQjRxqFwoTCMjV9oCdxusCFQAAAAAdAAAAABAD

EDIT: znalazłem alternatywę w postaci restFB. Jest to nakładka na facebooka graph api i jest wspierana cały czas. Zrobię tak jak** Bambo** napisałeś. Myślę, że te podejście jest mi najblższe.

edytowany 1x, ostatnio: dobrzyn227
Skoq
IMO to flow jest ok, w tamtym roku integrowałem się z m.in. fejsem i z tego co pamiętam tak to wyglądało. Też się wtedy 'przejechałem' na Spring Social ;p
Bambo
  • Rejestracja:ponad 10 lat
  • Ostatnio:8 miesięcy
  • Postów:779
3

@dobrzyn227:
Ja mam coś takiego

Kopiuj
import io.vavr.control.Option
import io.vavr.control.Try
import org.springframework.social.facebook.api.User
import org.springframework.social.facebook.api.impl.FacebookTemplate

class FacebookService(private val socialLoginService: SocialLoginService) {

    fun login(facebookLoginForm: FacebookLoginForm): Attempt<String> {
        val facebook = FacebookTemplate(facebookLoginForm.token)
        return Try.of { facebook.fetchObject("me", User::class.java, "email") }
                .map { socialLoginService.addUserOrUpdate(it.email) }
                .toEither(AppError.CAN_NOT_SOCIAL_LOGIN)
    }
}
edytowany 2x, ostatnio: Bambo
D2
  • Rejestracja:około 6 lat
  • Ostatnio:około 3 lata
  • Postów:26
0
Bambo napisał(a):

@dobrzyn227:
Ja mam coś takiego

Kopiuj
import io.vavr.control.Option
import io.vavr.control.Try
import org.springframework.social.facebook.api.User
import org.springframework.social.facebook.api.impl.FacebookTemplate

class FacebookService(private val socialLoginService: SocialLoginService) {

    fun login(facebookLoginForm: FacebookLoginForm): Attempt<String> {
        val facebook = FacebookTemplate(facebookLoginForm.token)
        return Try.of { facebook.fetchObject("me", User::class.java, "email") }
                .map { socialLoginService.addUserOrUpdate(it.email) }
                .toEither(AppError.CAN_NOT_SOCIAL_LOGIN)
    }
}

dzięki ! W podobny sposób planowałem to zrobić. Jedynie zastanawiam się czy identyfikować takiego usera w bazie za pomocą id fb czy emaila. Bo teoretycznie emaila może zmienić poprzez fb i wtedy profil zapisany w bazie będzie musiał zostać utworzony ponownie z innym emailem.

Bambo
Nie pamiętam już co tam idzie dokładnie z Fb i Google. Jeśli idzie ID usera to zapisz sobie w bazie obok maila FB_USER_ID i GOOGLE_USER_ID i potem jak dostaniesz z FB swój profil to w DB szukaj nie po mailu tylko tym ID fejsbukowym. Pamiętaj, że identyfikatorem Twojego systemowego Usera jest ID tworzone przez Ciebie, a nie żaden email czy coś innego zewnętrznego/zmiennego.

Zarejestruj się i dołącz do największej społeczności programistów w Polsce.

Otrzymaj wsparcie, dziel się wiedzą i rozwijaj swoje umiejętności z najlepszymi.