web-dev-qa-db-ja.com

Spring BootOAuth2-トークンからユーザーの詳細を取得できませんでした

この問題の解決策をWebで検索しましたが、有効な解決策は見つかりませんでした。基本的なSpringBootOAuth2認証プロバイダーとクライアントをセットアップしようとしています。

Spring Bootの公式の指示に従い、FacebookとGithubでシングルサインオンを作成しました。次に、指示に従ってSecure Spring BootWebアプリケーションを作成しました。

独自の承認サーバーを作成したかったので、説明されているように@EnableAuthorizationServerアノテーションをセキュアWebアプリケーションに追加しました ここ 。リンクに記載されているように、OAuth2クライアントの詳細も追加しました。さらに指示に従い、OAuth2クライアントを作成しました。

両方のアプリケーションを起動し、127.0.0.1:9999にアクセスしてクライアントを開き、クライアントがlocalhost:8080/loginにリダイレクトし、ユーザーの詳細を入力すると、認証プロバイダーが127.0.0.1:9999/loginにリダイレクトし、エラーメッセージが表示されます。

認証に失敗しました:トークンからユーザーの詳細を取得できませんでした

これがログに記録されるものです。

INFO 2800 --- [nio-9999-exec-3] o.s.b.a.s.o.r.UserInfoTokenServices:ユーザー情報の取得元:http:// localhost:8080/me

DEBUG 2800 --- [nio-9999-exec-3] o.s.s.oauth2.client.OAuth2RestTemplate:http:// localhost:8080/meのGETリクエストを作成しました

DEBUG 2800 --- [nio-9999-exec-3] o.s.s.oauth2.client.OAuth2RestTemplate:リクエストAcceptヘッダーを[application/json、application/* + json]に設定しています

DEBUG 2800 --- [nio-9999-exec-3] o.s.s.oauth2.client.OAuth2RestTemplate:http:// localhost:8080/meに対するGETリクエストの結果は200(OK)

INFO 2800 --- [nio-9999-exec-3] osbasorUserInfoTokenServices:ユーザーの詳細をフェッチできませんでした:クラスorg.springframework.web.client.RestClientException、応答を抽出できませんでした:応答タイプ[インターフェイスJavaに適したHttpMessageConverterが見つかりません。 util.Map]およびコンテンツタイプ[text/html; charset = UTF-8]]

これは私のクライアントアプリケーションです:

@EnableAutoConfiguration
@Configuration
@EnableOAuth2Sso
@RestController
public class ClientApplication {

    @RequestMapping("/")
    public String home(Principal user) {
        return "Hello " + user.getName();
    }

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

}

これはクライアントアプリケーションYMLです:

server:
  port: 9999
security:
  oauth2:
    client:
      client-id: acme
      client-secret: acmesecret
      access-token-uri: http://localhost:8080/oauth/token
      user-authorization-uri: http://localhost:8080/oauth/authorize
    resource:
      user-info-uri: http://localhost:8080/me

これは私の承認プロバイダーアプリケーションです:

@SpringBootApplication
public class SecurityApp {

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

}

@Configuration
@EnableWebSecurity
@EnableAuthorizationServer
public class WebSecurityConfig extends WebSecurityConfigurerAdapter {
    @Override
    protected void configure(HttpSecurity http) throws Exception {
        http
            .authorizeRequests()
                .antMatchers("/", "/home").permitAll()
                .anyRequest().authenticated()
                .and()
            .formLogin()
                .loginPage("/login")
                .permitAll()
                .and()
            .logout()
                .permitAll();
    }

    @Autowired
    public void configureGlobal(AuthenticationManagerBuilder auth) throws Exception {
        auth
            .inMemoryAuthentication()
                .withUser("user").password("password").roles("USER");
    }
}

@Configuration
public class MvcConfig extends WebMvcConfigurerAdapter {

    @Override
    public void addViewControllers(ViewControllerRegistry registry) {
        registry.addViewController("/home").setViewName("home");
        registry.addViewController("/").setViewName("home");
        registry.addViewController("/hello").setViewName("hello");
        registry.addViewController("/login").setViewName("login");
    }

}

@RestController
public class Controller {

    @RequestMapping({ "/user", "/me" })
    public Map<String, String> user(Principal principal) {
      Map<String, String> map = new LinkedHashMap<>();
      map.put("name", principal.getName());
      return map;
    }
}

これはアプリケーションプロバイダーYMLです:

security:
  oauth2:
    client:
      client-id: acme
      client-secret: acmesecret
      scope: read,write
      auto-approve-scopes: '.*'
8
dplesa

問題を解決しました!ユーザーエンドポイント(user-info-uri)のリクエストを処理するリソースサーバーがありませんでした。承認プロバイダーアプリケーションに、次のクラスを追加しました。

@Configuration
@EnableResourceServer
public class ResourceServer
        extends ResourceServerConfigurerAdapter {
    @Override
    public void configure(HttpSecurity http) throws Exception {
        http
            .antMatcher("/me")
            .authorizeRequests().anyRequest().authenticated();
    }
}
7
dplesa