it-swarm.com.de

Spring Boot 2.0.3 + Sicherheit + Oauth2 Autokonfiguration

Spring Boot 2.0.3 + Sicherheit + Oauth2 Autokonfiguration

Ich arbeite mit OAuth2 und Microservices. Ich habe einen Microservice erstellt, um die Autorisierungstoken zu generieren, und einen weiteren Microservice als Client. Die Generierung von Token funktioniert, aber wenn ich versuche, dieses generierte Token für die Authentifizierung im Client-Dienst zu verwenden, funktioniert es nicht.

Microservice, der die Token generiert: localhost: 9999

Token generiert mit URL: estrutura: estruturasecret @ localhost: 9999/oauth/token

   [
       {
          "key":"grant_type",
          "value":"password"
       },
       {
          "key":"username",
          "value":"matheus"
       },
       {
          "key":"password",
          "value":"teste"
       },
       {
          "key":"client_id",
          "value":"estrutura"
       }
    ]

rückkehr:

 {
        "access_token": "2e4c26b3-0fcf-493e-a255-6216b98811c5",
        "token_type": "bearer",
        "refresh_token": "5e33740a-ccb9-4ec1-94be-3a4643b8097a",
        "expires_in": 42479,
        "scope": "read write"
    }

Kundenmikroservice: localhost: 9090

@SpringBootApplication
@EnableResourceServer
public class ClientServer {
   public static void main(String[] args) {
      SpringApplication.run(ClientServer.class, args);
   }
}

application.yml:

server:
  port: 9090
  servlet:
    context-path: /client
spring:
  application:
    name: client-server
  security:
    oauth2:
      client:
        client-id: estrutura
        client-secret: estruturasecret
        access-token-uri: localhost:9999/oauth/token
        user-authorization-uri: localhost:9999/oauth/authorize
      resource:
        token-info-uri: localhost:9999/oauth/check_token
logging:
  level:
    org.springframework.security: DEBUG

Error:

<error>invalid_token</error>
<error_description>Invalid access token: 2e4c26b3-0fcf-493e-a255-6216b98811c5</error_description>

Protokolle:

2018-06-26 11:24:42.641 DEBUG 18658 --- [nio-9090-exec-2] o.s.security.web.FilterChainProxy        : /alunos at position 5 of 11 in additional filter chain; firing Filter: 'OAuth2AuthenticationProcessingFilter'
2018-06-26 11:24:42.641 DEBUG 18658 --- [nio-9090-exec-2] p.a.OAuth2AuthenticationProcessingFilter : Authentication request failed: error="invalid_token", error_description="Invalid access token: 2e4c26b3-0fcf-493e-a255-6216b98811c5"
2018-06-26 11:24:42.645 DEBUG 18658 --- [nio-9090-exec-2] o.s.s.w.header.writers.HstsHeaderWriter  : Not injecting HSTS header since it did not match the requestMatcher org.springframework.se[email protected]1fa75b
2018-06-26 11:24:42.647 DEBUG 18658 --- [nio-9090-exec-2] s.s.o.p.e.DefaultOAuth2ExceptionRenderer : Written [error="invalid_token", error_description="Invalid access token: 2e4c26b3-0fcf-493e-a255-6216b98811c5"] as "application/xml;charset=UTF-8" using [org.springfram[email protected]30d6fa45]
2018-06-26 11:24:42.647 DEBUG 18658 --- [nio-9090-exec-2] s.s.w.c.SecurityContextPersistenceFilter : SecurityContextHolder now cleared, as request processing completed

Dokumentation: https://docs.spring.io/spring-security-oauth2-boot/docs/current-SNAPSHOT/reference/htmlsingle/#boot-features-security-oauth2-authorization-server

Ich habe versucht, Ihren Anwendungsfall zu replizieren: Ich entwickle einen AuthServer mit Spring Cloud-Sicherheit und einen ResourceServer. Das Problem, das ich bei der Verwendung der Token-Info-Uri-Strategie sehe, ist, dass im Frühling zur Überprüfung des Tokens ein RemoteTokenServices verwendet wird und ein OAuth2RestTemplate zum Abrufen der Token-Informationen verwendet wird. Wenn Sie die Konfiguration verwenden möchten, müssen Sie diese Art einfügen der Konfiguration wie folgt:

@EnableOAuth2Client
@EnableResourceServer
@SpringBootApplication
public class HelloOauthServiceApplication {

    public static void main(String[] args) {
        SpringApplication.run(HelloOauthServiceApplication.class, args);
    }

    @Bean
    public OAuth2RestTemplate oAuth2RestTemplate(OAuth2ProtectedResourceDetails resource){
        return new OAuth2RestTemplate(resource);
    }
}

beachten Sie die Definitionen von @EnableOAuth2Client und OAuth2RestTemplate. Diese Konfiguration wird bis zum Frühjahr verwendet, um Ihr Token zu validieren und zu aktualisieren.

Auf diese Weise muss jeder Ressourcenserver auch eine Client-Anwendung sein und meiner Erfahrung nach nicht skalierbar. Mein persönlicher Rat ist, die User-Info-Uri-Strategie anzuwenden. In diesem Fall verwendet spring einen speziellen Endpunkt, um die Benutzerinformationen wiederherzustellen. Die Konfiguration ist sehr einfach in Ihrem Ressourcenserver. Sie haben nur @EnableResourceServer definiert. Wie in Ihrem Beispiel in Ihrem Yaml können Sie nur den Ressourcenteil wie unten konfigurieren

security:
  oauth2:
    resource:
     user-info-uri: http://localhost:9090/account/userInfo.json
     preferTokenInfo: false

Die einzige zusätzliche Entwicklung befindet sich auf Ihrem Authentifizierungsserver, der die Benutzerinformationen auf einem Endpunkt wie dem folgenden bereitstellen muss:

@RestController
@RequestMapping("/account")
class UserRestFullEndPoint {

    @GetMapping("/userInfo")
    public Principal userInfo(Principal principal){
        return principal;
    }
}

Ich verwende diesen Ansatz oft und habe festgestellt, dass er sehr gut funktioniert und skaliert, da Sie ihn in Ihren Ressourcenservern nicht wie eine Client-App definieren müssen.

Ich hoffe, dass es nützlich sein kann

p.s.

in deiner Konfiguration hast du das http-Protokoll vergessen:

server:
  port: 9090
  servlet:
    context-path: /client
    spring:
      application:
        name: client-server
      security:
        oauth2:
          client:
            client-id: estrutura
            client-secret: estruturasecret
            access-token-uri: http://localhost:9999/oauth/token
            user-authorization-uri: http://localhost:9999/oauth/authorize
          resource:
            token-info-uri: http://localhost:9999/oauth/check_token
    logging:
      level:
        org.springframework.security: DEBUG
2
Valerio Vaudi