9

W aplikacji Spring Boot Zabezpieczam swoje punkty końcowe REST w Spring MVC za pomocą Spring Security i Spring OAuth2. Posiadam własne serwery Authorization \ Resource, więc aby móc się komunikować z naszym API, klient (AngularJS) musi uzyskać acessToken z mojego serwera autoryzacji API.Rest, Spring własny serwer OAuth2 + dostawcy OAuth2, tacy jak Facebook, Google, Yahoo

Wszystko działa poprawnie, ale do uwierzytelnienia/autoryzacji w moim API, użytkownik musi utworzyć swoje konto i podać nam swoją nazwę użytkownika/hasło.

Chciałbym uprościć ten proces i chciałbym zaproponować użytkownikowi uwierzytelnienie na moim API za pośrednictwem usługodawców Google/Facebook/Twitter oAuth.

W tej chwili nie mam jasnego zrozumienia, jak to musi działać. Na przykład jeden z moich pomysłów - Facebook wyda własny dostępToken i przekaże go z powrotem do mojego API. Na podstawie tego tokenu dostępu mój interfejs API wyda własny klucz dostępu i przekaże go z powrotem do aplikacji klienckiej (AngularJS). Czy powinienem przekazać Facebook accessToken bezpośrednio do aplikacji klienckiej?

Jaka jest prawidłowa architektura opisywanego przypadku? Jak to działa?

Być może jest jakiś przykład demonstrujący tę architekturę w oparciu o framework Spring?

Odpowiedz

4

Jeśli chcesz przekazać uwierzytelnienie do zewnętrznego dostawcy, możesz użyć OAuth2ClientAuthenticationProcessingFilter lub adnotacji wygody i konfiguracji zewnętrznej podanych w Spring Cloud Security. Przykład (ze strony głównej Wiosna Cloud Security):

Aplication.java:

@SpringBootApplication 
@EnableOAuth2Sso 
public class Application { 
    ... 
} 

application.yml:

spring: 
    oauth2: 
    client: 
     clientId: bd1c0a783ccdd1c9b9e4 
     clientSecret: 1a9030fbca47a5b2c28e92f19050bb77824b5ad1 
     accessTokenUri: https://github.com/login/oauth/access_token 
     userAuthorizationUri: https://github.com/login/oauth/authorize 
     clientAuthenticationScheme: form 
    resource: 
     userInfoUri: https://api.github.com/user 
     preferTokenInfo: false 

który współpracuje z github jeśli aplikacja jest uruchomiona na porcie 8080 (Wierzę). Podobna konfiguracja działa z Facebookiem, odlewnią chmury, Google i innymi dostawcami OAuth2.

+1

dzięki za odpowiedź. Wygląda świetnie, wypróbuję to rozwiązanie dzisiaj z mojego domowego komputera! Jedno pytanie - czy będzie współpracować z moim własnym serwerem OAuth2 zaimplementowanym za pomocą Spring OAuth? – alexanoid

+0

Powinien działać z każdym dostawcą oauth2. Ale nie ustawiaj 'clientAuthenticationScheme' dla dostawcy Spring (domyślnie jest on wyłączony na serwerze). –

+2

Dzięki, mam na myśli to, że mam już własny serwer OAuth2 wewnątrz tej aplikacji (ten serwer OAuth2 jest częścią tej aplikacji). Oprócz tej metody uwierzytelniania chciałbym dodać zewnętrznych dostawców oauth2. Czy to zadziała w tym przypadku? – alexanoid

1

W przypadku własnych tokenów OAuth2 lub OAuth2 + JWT zapoznaj się z następującym pytaniem: Integrate Spring Security OAuth2 and Spring Social szczególnie odpowiedź udzielona przez @rbarriuso. Musisz podać własne SocialAuthenticationSuccessHandler i wysłać przekierowanie z własnym oauth2Token po udanej autoryzacji z dowolnym dostawcą OAuth2 z 3rdparty.

Innymi słowy, główną ideą tego rozwiązania agnostycznego jest wydawanie własnego tokena dostępu i dostarczanie go użytkownikowi po udanym uwierzytelnieniu z dostawcami OAuth2 z 3rdparty.