Spring OAuth 2 Facebook

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 !

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.

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ę?

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/

0

@EnableOauth2Sso na konfiguracji security

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.

3

@dobrzyn227:
Ja mam coś takiego

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)
    }
}
0
Bambo napisał(a):

@dobrzyn227:
Ja mam coś takiego

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.

1 użytkowników online, w tym zalogowanych: 0, gości: 1