Autentifikácia pomocou Reddit OAuth2 a jarnej bezpečnosti

1. Prehľad

V tomto tutoriále použijeme Spring Security OAuth na autentifikáciu pomocou Reddit API.

2. Konfigurácia Maven

Najskôr, aby sme mohli použiť Spring Security OAuth, musíme k nášmu pridať nasledujúcu závislosť pom.xml (samozrejme pozdĺž akejkoľvek inej jarnej závislosti, ktorú môžete použiť):

 org.springframework.security.oauth spring-security-oauth2 2.0.6.RELEASE 

3. Nakonfigurujte klienta OAuth2

Ďalej - nakonfigurujme nášho klienta OAuth2 - OAuth2RestTemplate - a a reddit.vlastnosti súbor pre všetky vlastnosti súvisiace s autentifikáciou:

@Configuration @ EnableOAuth2Client @PropertySource ("classpath: reddit.properties") chránená statická trieda ResourceConfiguration {@Value ("$ {accessTokenUri}") súkromný reťazec accessTokenUri; @Value ("$ {userAuthorizationUri}") private String userAuthorizationUri; @Value ("$ {clientID}") private String clientID; @Value ("$ {clientSecret}") private String clientSecret; @Bean public OAuth2ProtectedResourceDetails reddit () {AuthorizationCodeResourceDetails podrobnosti = nový AuthorizationCodeResourceDetails (); details.setId ("reddit"); details.setClientId (clientID); details.setClientSecret (clientSecret); details.setAccessTokenUri (accessTokenUri); details.setUserAuthorizationUri (userAuthorizationUri); details.setTokenName ("oauth_token"); details.setScope (Arrays.asList ("identita")); details.setPreEstablishedRedirectUri ("// localhost / login"); details.setUseCurrentUri (false); podrobnosti o vrátení; } @Bean public OAuth2RestTemplate redditRestTemplate (OAuth2ClientContext clientContext) {OAuth2RestTemplate template = new OAuth2RestTemplate (reddit (), clientContext); AccessTokenProvider accessTokenProvider = new AccessTokenProviderChain (Arrays. AsList (new MyAuthorizationCodeAccessTokenProvider (), new ImplicitAccessTokenProvider (), new ResourceOwnerPasswordAccessTokenProvider (), new ClientCredentialsAccessTokenProvider () template.setAccessTokenProvider (accessTokenProvider); návratová šablóna; }}

A „reddit.vlastnosti“:

clientID = xxxxxxxx clientSecret = xxxxxxxx accessTokenUri = // www.reddit.com/api/v1/access_token userAuthorizationUri = // www.reddit.com/api/v1/authorize

Svoj tajný kód môžete získať vytvorením aplikácie Reddit z adresy //www.reddit.com/prefs/apps/

Budeme používať OAuth2RestTemplate do:

  1. Získajte prístupový token potrebný na prístup k vzdialenému prostriedku.
  2. Prístup k vzdialenému prostriedku získate po získaní prístupového tokenu.

Všimnite si tiež, ako sme pridali rozsah „identita”Do Redditu OAuth2ProtectedResourceDetails aby sme mohli neskôr získať informácie o užívateľskom účte.

4. Vlastné AuthorizationCodeAccessTokenProvider

Implementácia Reddit OAuth2 sa trochu líši od štandardu. A tak - namiesto toho, aby elegantne predĺžil AuthorizationCodeAccessTokenProvider - musíme skutočne prepísať niektoré jeho časti.

Existujú vylepšenia na sledovanie problémov s github, vďaka ktorým to nebude potrebné, ale tieto problémy ešte nie sú hotové.

Jednou z neštandardných vecí, ktorú Reddit robí, je - keď presmerujeme používateľa a vyzveme ho na autentizáciu pomocou Redditu, musíme mať v URL presmerovania nejaké vlastné parametre. Konkrétnejšie - ak požadujeme permanentný prístupový token od Redditu - musíme pridať parameter „trvanie„S hodnotou“trvalé“.

Takže po predĺžení AuthorizationCodeAccessTokenProvider - pridali sme tento parameter do getRedirectForAuthorization () metóda:

 requestParameters.put ("trvanie", "trvalé");

Celý zdrojový kód si môžete skontrolovať tu.

5. ServerInitializer

Ďalej - vytvorme si náš zvyk ServerInitializer.

Musíme pridať filtračnú fazuľu s id oauth2ClientContextFilter, aby sme ho mohli použiť na uloženie aktuálneho kontextu:

verejná trieda ServletInitializer rozširuje AbstractDispatcherServletInitializer {@Override chránený WebApplicationContext createServletApplicationContext () {AnnotationConfigWebApplicationContext kontext = nový AnnotationConfigWebApplicationContext (); context.register (WebConfig.class, SecurityConfig.class); návratový kontext; } @Override chránený reťazec [] getServletMappings () {vrátiť nový reťazec [] {"/"}; } @Override chránený WebApplicationContext createRootApplicationContext () {return null; } @Override public void onStartup (ServletContext servletContext) vyvolá ServletException {super.onStartup (servletContext); registerProxyFilter (servletContext, "oauth2ClientContextFilter"); registerProxyFilter (servletContext, "springSecurityFilterChain"); } private void registerProxyFilter (ServletContext servletContext, názov reťazca) {DelegatingFilterProxy filter = nový DelegatingFilterProxy (meno); filter.setContextAttribute ("org.springframework.web.servlet.FrameworkServlet.CONTEXT.dispatcher"); servletContext.addFilter (názov, filter). addMappingForUrlPatterns (null, false, "/ *"); }}

6. Konfigurácia MVC

Teraz sa pozrime na našu konfiguráciu MVC našej jednoduchej webovej aplikácie:

@Configuration @EnableWebMvc @ComponentScan (basePackages = {"org.baeldung.web"}) verejná trieda WebConfig implementuje WebMvcConfigurer {@Bean public static PropertySourcesPlaceholderConfigurer propertySourcesPlaceholderConfigurer () {return new PropertySourcesPlaceholderConfigurer (); } @Bean public ViewResolver viewResolver () {InternalResourceViewResolver viewResolver = nový InternalResourceViewResolver (); viewResolver.setPrefix ("/ WEB-INF / jsp /"); viewResolver.setSuffix (". jsp"); spať viewResolver; } @Override public void configureDefaultServletHandling (konfigurátor DefaultServletHandlerConfigurer) {configurer.enable (); } public void addResourceHandlers (register ResourceHandlerRegistry) {registry.addResourceHandler ("/ resources / **"). addResourceLocations ("/ resources /"); } @Override public void addViewControllers (ViewControllerRegistry registry) {registry.addViewController ("/ home.html"); }}

7. Konfigurácia zabezpečenia

Ďalej - poďme sa na to pozrieť hlavná konfigurácia Spring Security:

@Configuration @EnableWebSecurity verejná trieda SecurityConfig rozširuje WebSecurityConfigurerAdapter {@Override protected void configure (AuthenticationManagerBuilder auth) vyvolá výnimku {auth.inMemoryAuthentication (); } @Override protected void configure (HttpSecurity http) vyvolá výnimku {http .anonymous (). Disable () .csrf (). Disable () .authorizeRequests () .antMatchers ("/ home.html"). HasRole ("USER" ). a () .httpBasic () .authenticationEntryPoint (oauth2AuthenticationEntryPoint ()); } súkromné ​​LoginUrlAuthenticationEntryPoint oauth2AuthenticationEntryPoint () {vrátiť nové LoginUrlAuthenticationEntryPoint ("/ login"); }}

Poznámka: Pridali sme jednoduchú konfiguráciu zabezpečenia, ktorá presmerováva na „/Prihlásiť sa”, Ktoré získavajú informácie o používateľovi a načítajú z nich autentizáciu - ako je vysvetlené v nasledujúcej časti.

8. RedditController

Teraz - poďme sa pozrieť na náš ovládač RedditController.

Používame metódu redditLogin () získať informácie o používateľovi z jeho účtu Reddit a načítať z neho autentizáciu - ako v nasledujúcom príklade:

@Controller verejná trieda RedditController {@Autowired private OAuth2RestTemplate redditRestTemplate; @RequestMapping ("/ login") public String redditLogin () {JsonNode node = redditRestTemplate.getForObject ("//oauth.reddit.com/api/v1/me", JsonNode.class); UsernamePasswordAuthenticationToken auth = nový UsernamePasswordAuthenticationToken (node.get ("name"). AsText (), redditRestTemplate.getAccessToken (). GetValue (), Arrays.asList (new SimpleGrantedAuthority ("ROLE_USER"))); SecurityContextHolder.getContext (). SetAuthentication (auth); return "redirect: home.html"; }}

Zaujímavý detail tejto klamne jednoduchej metódy - šablóna reddit pred vykonaním akejkoľvek žiadosti skontroluje, či je prístupový token k dispozícii; získava token, ak nie je k dispozícii.

Ďalej - predstavujeme informácie nášmu veľmi zjednodušenému klientskemu rozhraniu.

9. home.jsp

Na záver - poďme sa na to pozrieť home.jsp - na zobrazenie informácií získaných z účtu Reddit používateľa:

10. Záver

V tomto úvodnom článku sme to preskúmali autentifikácia pomocou rozhrania Reddit OAuth2 API a zobrazenie niekoľkých veľmi základných informácií v jednoduchom klientskom rozhraní.

Teraz, keď sme autentifikovaní, v ďalšom článku tejto novej série preskúmame možnosti robenia zaujímavejších vecí pomocou rozhrania Reddit API.

The úplná implementácia tohto tutoriálu nájdete v projekte github - toto je projekt založený na Eclipse, takže by malo byť ľahké ho importovať a spustiť tak, ako je.


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