OAuth2.0 i dinamička registracija klijenta (pomoću naslijeđenog naslaga Spring Security OAuth)

1. Uvod

U ovom uputstvu pripremit ćemo dinamičku registraciju klijenta s OAuth2.0. OAuth2.0 je autorizacijski okvir koji omogućuje dobivanje ograničenog pristupa korisničkim računima na HTTP usluzi. Klijent OAuth2.0 je aplikacija koja želi pristupiti korisničkom računu. Ovaj klijent može biti vanjska web aplikacija, korisnički agent ili samo izvorni klijent.

Da bismo postigli dinamičku registraciju klijenta, pohranit ćemo vjerodajnice u bazu podataka, umjesto u kodiranu konfiguraciju. Aplikacija koju ćemo proširiti u početku je opisana u vodiču Spring REST API + OAuth2.

Bilješka: ovaj članak koristi nasljeđeni projekt Spring OAuth.

2. Ovisnosti Mavena

Prvo ćemo postaviti sljedeći skup ovisnosti:

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

Imajte na umu da koristimo proljeće-jdbc jer ćemo koristiti DB za pohranu novoregistriranih korisnika s lozinkama.

3. Konfiguracija OAuth2.0 poslužitelja

Prvo, moramo konfigurirati naš OAuth2.0 autorizacijski poslužitelj. Glavna konfiguracija nalazi se u sljedećoj klasi:

@Configuration @PropertySource ({"classpath: persistence.properties"}) @EnableAuthorizationServer javna klasa OAuth2AuthorizationServerConfig proširuje AuthorizationServerConfigurerAdapter {// config}

Postoji nekoliko glavnih stvari koje moramo konfigurirati; krenimo s ClientDetailsServiceConfigurer:

@Override javna void konfiguracija (konačni ClientDetailsServiceConfigurer klijenti) baca izuzetak {clients.jdbc (dataSource ()) // ...}

Ovo će osigurati da upotrijebimo upornost za dobivanje podataka o klijentu.

Postavimo naravno ovaj standardni izvor podataka:

@Bean public DataSource dataSource () {DriverManagerDataSource dataSource = novi 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")); vratiti dataSource; }

I tako, sada će naša aplikacija koristiti bazu podataka kao izvor registriranih klijenata, umjesto tipičnih tvrdo kodiranih u memoriji klijenata.

4. DB shema

Definirajmo sada SQL strukturu za pohranu naših OAuth klijenata:

stvoriti tablicu oauth_client_details (client_id VARCHAR (256) PRIMARNI KLJUČ, resource_ids VARCHAR (256), client_secret VARCHAR (256), opseg VARCHAR (256), odobreni_grant_tipovi VARCHAR (256), web_server_redirect_uri VARCHAR (256) VARCHAR (256), VARCHAR, 256AR, VARCHAR, 256EG, VARCHAR, 256AR, VARCHAR, 256AR, VARCHAR, 256EG, VARCHAR, 256AR, VARCHAR, 256EG, VARCHAR, 256EG, VARCHAR, 256AR , refresh_token_validity INTEGER, dodatne_informacije VARCHAR (4096), automatski odobri VARCHAR (256));

Najvažnija polja iz oauth_client_details trebali bismo se usredotočiti na:

  • client_id - za pohranu ID-a novo registriranih klijenata
  • client_secret - za pohranu lozinke klijenata
  • access_token_validity - što pokazuje je li klijent još uvijek valjan
  • vlasti - naznačiti koje su uloge dopuštene kod određenog klijenta
  • opseg - dopuštene radnje, na primjer pisanje statusa na Facebooku itd.
  • odobreni_tipovi_dodavanja, koji pruža informacije o tome kako se korisnici mogu prijaviti na određenog klijenta (u našem primjeru to je prijava putem obrasca s lozinkom)

Imajte na umu da svaki klijent ima jedan prema mnogo odnosa s korisnicima, što naravno znači više korisnika može koristiti jednog klijenta.

5. Ustrajmo na nekim klijentima

Pomoću definiranja SQL sheme konačno možemo stvoriti neke podatke u sustavu - i u osnovi definirati klijenta.

Koristit ćemo sljedeće podaci.sql skripta - koji će se Spring Boot pokrenuti prema zadanim postavkama - za inicijalizaciju DB-a:

INSERT INTO oauth_client_details (client_id, client_secret, scope, odobreni_grant_tipovi, web_server_redirect_uri, powers, access_token_validity, refresh_token_validity, Additional_information, auto Approve) VRIJEDNOSTI ("fooClientIdPassword", "secret, read, null, read, null, read, null, read, null, read, null, read, null, read, null, read, null, read, null, read, null, read, null, read, null, read, null, read, null, read, null, read, null, read, null, read, null, read, null, read, null, read, null, read, null, read, null, password, null, read, null, read, null, read, null, read, null, read, null, read, null, read, null, password, null" , null, 36000, 36000, null, true);

Opis najvažnijih polja u oauth_client_details nalazi se u prethodnom odjeljku.

6. Ispitivanje

Da bismo testirali dinamičku registraciju klijenta, moramo pokrenuti oboje spring-security-oauth-poslužitelj i izvor-sigurnost-oauth-resurs projekata na lukama 8081 i 8082.

Sad napokon možemo napisati nekoliko testova uživo.

Pretpostavimo da smo registrirali klijenta s imenom fooClientIdPassword, koji ima pristup čitanju foos.

Prvo ćemo pokušati dobiti token pristupa s Auth poslužitelja, koristeći već definirani klijent:

@Test javna praznina givenDBUser_whenRevokeToken_thenAuthorized () {String accessToken = получитьAccessToken ("fooClientIdPassword", "john", "123"); assertNotNull (accessToken); }

I evo logike dobivanja pristupnog tokena:

private String получитьAccessToken (String clientId, String korisničko ime, String lozinka) {Map params = new HashMap (); params.put ("vrsta_dodatka", "lozinka"); params.put ("client_id", clientId); params.put ("korisničko ime", korisničko ime); params.put ("lozinka", lozinka); Odgovor odgovora = RestAssured.given (). Auth (). Preemptive () .basic (clientId, "secret"). I (). With (). Params (params) .when () .post ("// localhost: 8081 / spring-security-oauth-server / oauth / token "); vrati odgovor.jsonPath (). getString ("access_token"); }

7. Zaključak

U ovom uputstvu naučili smo kako dinamički registrirati neograničeni broj klijenata pomoću OAuth2.0 okvira.

Potpunu implementaciju ovog vodiča možete pronaći na GitHub-u - ovo je projekt zasnovan na Mavenu, pa bi ga trebalo lako uvesti i pokrenuti kakav jest.

Imajte na umu da ćete za testiranje trebati dodati klijente u DB i to .u sjećanju() config više neće biti valjan. Ako želite koristiti stari.u sjećanju() config, postoji druga datoteka koja sadrži konfiguraciju s tvrdo kodiranim klijentima.


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