OAuth2.0 a dynamická registrácia klienta (pomocou staršieho zásobníka Spring Security OAuth)

1. Úvod

V tejto príručke sa chystáme pripraviť dynamickú registráciu klienta pomocou protokolu OAuth2.0. OAuth2.0 je autorizačný rámec, ktorý umožňuje získanie obmedzeného prístupu k používateľským účtom v službe HTTP. Klient OAuth2.0 je aplikácia, ktorá chce získať prístup k používateľskému účtu. Týmto klientom môže byť externá webová aplikácia, užívateľský agent alebo iba natívny klient.

Aby sme dosiahli dynamickú registráciu klienta, budeme namiesto pevne nastavenej konfigurácie ukladať poverenia do databázy. Aplikácia, ktorú sa chystáme rozšíriť, bola pôvodne popísaná v tutoriáli Spring REST API + OAuth2.

Poznámka: tento článok využíva starší projekt Spring OAuth.

2. Maven závislosti

Najskôr nastavíme nasledujúcu skupinu závislostí:

 org.springframework.boot spring-boot-starter-web org.springframework spring-jdbc org.springframework.security.oauth spring-security-oauth2 

Upozorňujeme, že používame jar-jdbc pretože budeme používať databázu na ukladanie novo registrovaných používateľov s heslami.

3. Konfigurácia servera OAuth2.0

Najskôr musíme nakonfigurovať náš autorizačný server OAuth2.0. Hlavná konfigurácia je v nasledujúcej triede:

@Configuration @PropertySource ({"classpath: persistence.properties"}) @EnableAuthorizationServer verejná trieda OAuth2AuthorizationServerConfig rozširuje AuthorizationServerConfigurerAdapter {// config}

Je potrebné nakonfigurovať niekoľko hlavných vecí; začnime s ClientDetailsServiceConfigurer:

@Override public void configure (koneční klienti ClientDetailsServiceConfigurer) vyvolá výnimku {clients.jdbc (dataSource ()) // ...}

Týmto zaistíme, že na získanie informácií o klientovi používame vytrvalosť.

Nastavme samozrejme tento štandardný zdroj údajov:

@Bean public DataSource dataSource () {DriverManagerDataSource dataSource = nový DriverManagerDataSource (); dataSource.setDriverClassName (env.getProperty ("jdbc.driverClassName")); dataSource.setUrl (env.getProperty ("jdbc.url")); dataSource.setUsername (env.getProperty ("jdbc.user")); dataSource.setPassword (env.getProperty ("jdbc.pass")); vrátiť dátový zdroj; }

A tak teraz bude naša aplikácia používať databázu ako zdroj registrovaných klientov namiesto typických pevne zakódovaných v pamäti klientov.

4. Schéma DB

Poďme teraz definovať štruktúru SQL pre ukladanie našich klientov OAuth:

vytvoriť tabuľku oauth_client_details (client_id VARCHAR (256) PRIMARY KEY, resource_ids VARCHAR (256), client_secret VARCHAR (256), scope VARCHAR (256), authorized_grant_types VARCHAR (256), web_server_redirect_uri VARCHAR (256), oprávnenia VARCHAR (256), oprávnenia VARCHAR (256), oprávnenia VARCHAR (256), oprávnenia VARCHAR (256), oprávnenia VARCHAR (256), oprávnenia VARCHAR (256), orgány VARCHAR , refresh_token_validity INTEGER, additional_information VARCHAR (4096), autoapprove VARCHAR (256));

Najdôležitejšie polia z oauth_client_details mali by sme sa zamerať na:

  • client_id - uložiť ID novo registrovaných klientov
  • client_secret - na uloženie hesla klientov
  • access_token_validity - ktorá označuje, či je klient stále platný
  • orgánmi - označiť, aké role sú povolené u konkrétneho klienta
  • rozsah - povolené akcie, napríklad písanie statusov na Facebook atď.
  • authorized_grant_types, ktorá poskytuje informácie o tom, ako sa môžu používatelia prihlásiť ku konkrétnemu klientovi (v našom príklade je to formulárové prihlásenie s heslom)

Upozorňujeme, že každý klient má medzi používateľmi jeden vzťah s mnohými, čo to samozrejme znamená viac klientov môže využívať jedného klienta.

5. Pretrvávajme niektorých klientov

Pomocou definície schémy SQL môžeme konečne vytvoriť niektoré údaje v systéme - a v zásade definovať klienta.

Použijeme nasledujúce data.sql skript - ktorý bude Spring Boot štandardne spustený - na inicializáciu DB:

INSERT INTO oauth_client_details (client_id, client_secret, scope, authorized_grant_types, web_server_redirect_uri, autority, access_token_validity, refresh_token_validity, additional_information, autoapprove) VALUES ("fooClientIdPassword", "read", "write", "foo," heslo "," foo, "tajomstvo", "foo" , null, 36000, 36000, null, true);

Popis najdôležitejších polí v oauth_client_details je uvedené v predchádzajúcej časti.

6. Testovanie

Aby sme mohli otestovať dynamickú registráciu klienta, musíme spustiť oboje jar-bezpecnost-oauth-server a spring-security-oauth-resource 8081, respektíve 8082 portov.

Teraz môžeme konečne napísať niekoľko testov naživo.

Predpokladajme, že sme zaregistrovali klienta s menom id fooClientIdPassword, ktorý má prístup na čítanie foos.

Najskôr sa pokúsime získať prístupový token zo servera Auth pomocou už definovaného klienta:

@Test public void givenDBUser_whenRevokeToken_thenAuthorized () {String accessToken = obtainAccessToken ("fooClientIdPassword", "john", "123"); assertNotNull (accessToken); }

A tu je logika získania prístupového tokenu:

private String obtainAccessToken (String clientId, String username, String password) {Map params = new HashMap (); params.put ("grant_type", "heslo"); params.put ("client_id", clientId); params.put ("užívateľské meno", užívateľské meno); params.put ("heslo", heslo); Response response = RestAssured.given (). Auth (). Preemptive () .basic (clientId, "secret"). A (). S (). Params (params) .when () .post ("// localhost: 8081 / spring-security-oauth-server / oauth / token "); návrat response.jsonPath (). getString ("access_token"); }

7. Záver

V tomto tutoriáli sme sa naučili, ako dynamicky registrovať neobmedzený počet klientov s protokolom OAuth2.0.

Plnú implementáciu tohto tutoriálu nájdete na GitHub - jedná sa o projekt založený na Maven, takže by malo byť ľahké ho importovať a spustiť tak, ako je.

Vezmite prosím na vedomie, že aby ste mohli otestovať, musíte do DB pridať klientov a to .v pamäti() konfigurácia už nebude platná. Ak chcete použiť staré.v pamäti() config, existuje druhý súbor obsahujúci konfiguráciu s pevne zakódovanými klientmi.


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