Hitelesítés a Reddit OAuth2 és a Spring Security szolgáltatással

1. Áttekintés

Ebben az oktatóanyagban a Spring Security OAuth segítségével fogunk hitelesíteni a Reddit API-val.

2. Maven konfiguráció

Először is, a Spring Security OAuth használatához - hozzá kell adnunk a következő függőséget pom.xml (természetesen bármilyen más tavaszi függőség mentén, amelyet használhat):

 org.springframework.security.oauth spring-security-oauth2 2.0.6. KÖZLEMÉNY 

3. Konfigurálja az OAuth2 klienst

Ezután konfiguráljuk az OAuth2 kliensünket - a OAuth2RestTemplate - és a reddit.tulajdonságok fájl az összes hitelesítéssel kapcsolatos tulajdonsághoz:

@Configuration @ EnableOAuth2Client @PropertySource ("classpath: reddit.properties") védett statikus osztály ResourceConfiguration {@Value ("$ {accessTokenUri}") privát karakterlánc accessTokenUri; @Value ("$ {userAuthorizationUri}") privát karakterlánc userAuthorizationUri; @Value ("$ {clientID}") privát karakterlánc kliensID; @Value ("$ {clientSecret}") privát karakterlánc clientSecret; @Bean public OAuth2ProtectedResourceDetails reddit () {AuthorizationCodeResourceDetails details = new AuthorizationCodeResourceDetails (); részletek.setId ("reddit"); details.setClientId (kliensID); részletek.setClientSecret (clientSecret); részletek.setAccessTokenUri (accessTokenUri); details.setUserAuthorizationUri (userAuthorizationUri); részletek.setTokenName ("oauth_token"); details.setScope (Arrays.asList ("azonosság")); details.setPreEstablishedRedirectUri ("// localhost / login"); részletek.setUseCurrentUri (hamis); visszatérési adatok; } @Bean public OAuth2RestTemplate redditRestTemplate (OAuth2ClientContext clientContext) {OAuth2RestTemplate template = új OAuth2RestTemplate (reddit (), clientContext); AccessTokenProvider accessTokenProvider = new AccessTokenProviderChain (tömbök. AsList (új MyAuthorizationCodeAccessTokenProvider (), új ImplicitAccessTokenProvider (), új ResourceOwnerPasswordAccessTokenProvider (), új ClientCredentialsAccessTokenProvider ( template.setAccessTokenProvider (accessTokenProvider); visszatérési sablon; }}

És „reddit.tulajdonságok“:

clientID = xxxxxxxx clientSecret = xxxxxxxx hozzáférésTokenUri = // www.reddit.com/api/v1/access_token userAuthorizationUri = // www.reddit.com/api/v1/authorize

Saját titkos kódot úgy szerezhet be, hogy létrehoz egy Reddit alkalmazást a //www.reddit.com/prefs/apps/ címen.

Használni fogjuk a OAuth2RestTemplate nak nek:

  1. Szerezze be a távoli erőforrás eléréséhez szükséges hozzáférési tokent.
  2. A hozzáférési jogkivonat megszerzése után férjen hozzá a távoli erőforráshoz.

Vegye figyelembe azt is, hogyan adtuk hozzá aidentitás”Redditnek OAuth2ProtectedResourceDetails hogy később visszakereshessük a felhasználói fiók adatait.

4. Egyedi AuthorizationCodeAccessTokenProvider

A Reddit OAuth2 implementáció kissé eltér a standardtól. És így - ahelyett, hogy elegánsan meghosszabbítaná a AuthorizationCodeAccessTokenProvider - felül kell írnunk néhány részét.

Vannak olyan github problémák, amelyek nyomon követik a fejlesztéseket, amelyek miatt ez nem szükséges, de ezek a kérdések még nem készültek el.

Az egyik nem szabványos dolog, amelyet a Reddit csinál: az, amikor átirányítjuk a felhasználót, és felszólítjuk a Reddit használatával történő hitelesítésre, rendelkeznünk kell néhány egyedi paraméterrel az átirányítási URL-ben. Pontosabban - ha állandó hozzáférési tokent kérünk a Reddit-től - hozzá kell adnunk egy paramétertidőtartamát”Értékkel„állandó“.

Tehát, miután meghosszabbította AuthorizationCodeAccessTokenProvider - hozzáadtuk ezt a paramétert a getRedirectForAuthorization () módszer:

 requestParameters.put ("időtartam", "állandó");

A teljes forráskódot itt ellenőrizheti.

5. A ServerInitializer

Következő - hozzuk létre a szokásunkat ServerInitializer.

Hozzá kell adnunk egy szűrőbabot azonosítóval oauth2ClientContextFilter, hogy felhasználhassuk az aktuális kontextus tárolására:

a public class ServletInitializer kiterjeszti az AbstractDispatcherServletInitializer {@Orride védett WebApplicationContext createServletApplicationContext () {AnnotationConfigWebApplicationContext context = new AnnotationConfigWebApplicationContext (); context.register (WebConfig.class, SecurityConfig.class); visszatérési kontextus; } @Orride védett karakterlánc [] getServletMappings () {return new String [] {"/"}; } @Orride védett WebApplicationContext createRootApplicationContext () {return null; } @Orride public void onStartup (ServletContext servletContext) dobja a ServletException {super.onStartup (servletContext); registerProxyFilter (servletContext, "oauth2ClientContextFilter"); registerProxyFilter (servletContext, "springSecurityFilterChain"); } private void registerProxyFilter (ServletContext servletContext, String name) {DelegatingFilterProxy szűrő = új DelegatingFilterProxy (név); filter.setContextAttribute ("org.springframework.web.servlet.FrameworkServlet.CONTEXT.dispatcher"); servletContext.addFilter (név, szűrő) .addMappingForUrlPatterns (null, hamis, "/ *"); }}

6. MVC konfiguráció

Most - nézzük meg egyszerű webalkalmazásunk MVC konfigurációját:

@Configuration @EnableWebMvc @ComponentScan (basePackages = {"org.baeldung.web"}) public class WebConfig implementálja a WebMvcConfigurer {@Bean public static PropertySourcesPlaceholderConfigurer propertySourcesPlaceholderConfigurer () {return new PropertySourcesf; } @Bean public ViewResolver viewResolver () {InternalResourceViewResolver viewResolver = new InternalResourceViewResolver (); viewResolver.setPrefix ("/ WEB-INF / jsp /"); viewResolver.setSuffix (". jsp"); visszatérő viewResolver; } @Orride public void configureDefaultServletHandling (DefaultServletHandlerConfigurer configurer) {configurer.enable (); } public void addResourceHandlers (ResourceHandlerRegistry nyilvántartás) {register.addResourceHandler ("/ resources / **"). addResourceLocations ("/ resources /"); } @Orride public void addViewControllers (ViewControllerRegistry registry) {register.addViewController ("/ home.html"); }}

7. Biztonsági konfiguráció

Következő - vessünk egy pillantást a tavaszi biztonsági fő konfiguráció:

@Configuration @EnableWebSecurity nyilvános osztály A SecurityConfig kiterjeszti a WebSecurityConfigurerAdapter {@Orride protected void configure (AuthenticationManagerBuilder auth) dobja a (z) {auth.inMemoryAuthentication () kivételt; } A @Orride védett érvénytelen konfiguráció (HttpSecurity http) dobja a {http .névtelen (). Disable () .csrf (). Disable () .authorizeRequests () .antMatchers ("/ home.html"). HasRole ("USER" kivételt) ) .és () .httpBasic () .authenticationEntryPoint (oauth2AuthenticationEntryPoint ()); } privát LoginUrlAuthenticationEntryPoint oauth2AuthenticationEntryPoint () {return new LoginUrlAuthenticationEntryPoint ("/ login"); }}

Megjegyzés: Hozzáadtunk egy egyszerű biztonsági konfigurációt, amely átirányította a/Belépés”, Amelyek megkapják a felhasználói információkat és betöltik belőlük a hitelesítést - amint azt a következő szakasz elmagyarázza.

8. RedditController

Most - vessünk egy pillantást a vezérlőnkre RedditController.

Módszert használunk redditLogin () hogy megszerezhesse a felhasználói információkat a Reddit-fiókjából, és hitelesítést töltsön be belőle - a következő példa szerint:

@Controller nyilvános osztály RedditController {@Autowired private OAuth2RestTemplate redditRestTemplate; @RequestMapping ("/ login") public String redditLogin () {JsonNode csomópont = redditRestTemplate.getForObject ("//oauth.reddit.com/api/v1/me", JsonNode.class); UsernamePasswordAuthenticationToken auth = new UsernamePasswordAuthenticationToken (node.get ("név"). AsText (), redditRestTemplate.getAccessToken (). GetValue (), Arrays.asList (új SimpleGrantedAuthority ("ROLE_USER"))); SecurityContextHolder.getContext (). SetAuthentication (auth); return "redirect: home.html"; }}

A megtévesztően egyszerű módszer érdekes részlete - a reddit sablon bármilyen kérés végrehajtása előtt ellenőrzi, hogy a hozzáférési token elérhető-e; tokent szerez, ha nem áll rendelkezésre.

Ezután - az információkat nagyon leegyszerűsített kezelőfelületünknek mutatjuk be.

9. otthon.jsp

Végül - vessünk egy pillantást otthon.jsp - a felhasználó Reddit-fiókjának lekérdezett információinak megjelenítése:

10. Következtetés

Ebben a bevezető cikkben feltártuk hitelesítés a Reddit OAuth2 API-val és néhány alapvető információ megjelenítése egy egyszerű kezelőfelületen.

Most, hogy hitelesítettük magunkat, felfedezzük, hogyan tehetünk érdekes dolgokat a Reddit API-val az új sorozat következő cikkében.

A teljes végrehajtása ennek az oktatóanyagnak a github projektje található meg - ez egy Eclipse alapú projekt, ezért könnyen importálhatónak és futtathatónak kell lennie.


$config[zx-auto] not found$config[zx-overlay] not found