Ошибка при попытке аутентификации веб-приложения с помощью Oauth2 и Strava с помощью Spring Boot - PullRequest
0 голосов
/ 09 июля 2020

Я пытаюсь использовать Strava для аутентификации клиентов, которые хотят использовать мое веб-приложение с помощью Spring Boot, и я застрял в этой ошибке:

.so c .w. OAuth2LoginAuthenticationFilter : Ошибка запроса аутентификации: org.springframework.security.oauth2.core.OAuth2AuthenticationException: [invalid_token_response] Произошла ошибка при попытке получить ответ токена доступа OAuth 2.0: не удалось извлечь ответ 1006: нет подходящего ответа * HttpMessageConverter найден для типа ответа [class org.springframework.security.oauth2.core.endpoint. OAuth2AccessTokenResponse ] и типа содержимого [text / html]

Я бы ценим любую помощь, чтобы продвинуться вперед и решить эту ошибку. Я упростил воспроизведение ошибки до двух классов:

DemoSecurity.java extending WebSecurityConfigurerAdapter 
DemoApplication.java as the entry to the application with @SpringBootApplication, 

, и вам нужно будет зарегистрировать приложение в Strava (https://www.strava.com/settings/api), чтобы получить client_secret и client_id . В Strava обратный вызов должен быть добавлен как localhost для запуска этого теста.

Наконец, чтобы воспроизвести ошибку, вам нужно только запустить приложение в вашей среде IDE и go в http://localhost: 8080 / авторизуйтесь в браузере.

Большое спасибо

Это мой application.yml:

spring:   
  security:
    oauth2:
      client:
        registration:
          strava:
            provider: strava-provider
            client-id: XXXXX
            client-secret: XXXXXXXXXXXXXXXXX
            client-authentication-method: POST
            authorization-grant-type: authorization_code
            redirect-uri: http://localhost:8080/login/oauth2/code/
            scope:
              - read
        provider:
          strava-provider:
            tokenUri: https://www.strava.com/api/v3/oauth/token/
            authorizationUri: https://www.strava.com/api/v3/oauth/authorize?response_type=code

Это мой пом. xml:

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
    

<modelVersion>4.0.0</modelVersion>
    <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>2.3.1.RELEASE</version>
        <relativePath/> <!-- lookup parent from repository -->
    </parent>
    <groupId>com.example</groupId>
    <artifactId>demo</artifactId>
    <version>0.0.1-SNAPSHOT</version>
    <name>demo</name>
    <description>Demo project for Spring Boot</description>

<properties>
    <java.version>1.8</java.version>
</properties>

<dependencies>
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-oauth2-client</artifactId>
    </dependency>
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-web</artifactId>
    </dependency>

    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-test</artifactId>
        <scope>test</scope>
        <exclusions>
            <exclusion>
                <groupId>org.junit.vintage</groupId>
                <artifactId>junit-vintage-engine</artifactId>
            </exclusion>
        </exclusions>
    </dependency>
</dependencies>

<build>
    <plugins>
        <plugin>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-maven-plugin</artifactId>
        </plugin>
    </plugins>
</build>

Это мое DemoApplication. java:

package com.example.demo;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.boot.autoconfigure.security.oauth2.client.servlet.OAuth2ClientAutoConfiguration;
import org.springframework.boot.autoconfigure.security.servlet.SecurityAutoConfiguration;

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

}

Это моя DemoSecurity. java:

package com.example.demo;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Configuration;
import org.springframework.security.config.annotation.web.builders.HttpSecurity;
import org.springframework.security.config.annotation.web.configuration.EnableWebSecurity;
import org.springframework.security.config.annotation.web.configuration.WebSecurityConfigurerAdapter;

@EnableWebSecurity
@Configuration
public class DemoSecurity extends WebSecurityConfigurerAdapter {
@Override
protected void configure(HttpSecurity http) throws Exception {
    http
            .authorizeRequests()
            .antMatchers("/login**","/", "/error", "/webjars/**").permitAll()
            .anyRequest()
            .authenticated().and()
            .oauth2Login()
    ;
}


}

Ответы [ 2 ]

0 голосов
/ 11 июля 2020

После проверки того, что ответил Войцех Лесняк (спасибо), ничего не имело смысла, но я понял это, по крайней мере, частично.

Это логи моего неудачного проекта:

Ответ: это журналы проекта, работающего с тем же исходным кодом:

2020-07-10 06:20:09.917 DEBUG 56106 --- [nio-8080-exec-2] .s.o.c.w.OAuth2LoginAuthenticationFilter : Request is to process authentication
2020-07-10 06:20:09.920 DEBUG 56106 --- [nio-8080-exec-2] o.s.s.authentication.ProviderManager     : Authentication attempt using org.springframework.security.oauth2.client.authentication.OAuth2LoginAuthenticationProvider
2020-07-10 06:20:10.689 DEBUG 56106 --- [nio-8080-exec-2] s.CompositeSessionAuthenticationStrategy : Delegating to org.springframework.security.web.authentication.session.ChangeSessionIdAuthenticationStrategy@30f74e79
2020-07-10 06:20:10.690 DEBUG 56106 --- [nio-8080-exec-2] s.CompositeSessionAuthenticationStrategy : Delegating to org.springframework.security.web.csrf.CsrfAuthenticationStrategy@8a8639c
2020-07-10 06:20:10.690 DEBUG 56106 --- [nio-8080-exec-2] .s.o.c.w.OAuth2LoginAuthenticationFilter : Authentication success. Updating SecurityContextHolder to contain: org.springframework.security.oauth2.client.authentication.OAuth2AuthenticationToken@efd72585: Principal: Name: [60310151], Granted Authorities: [[ROLE_USER, SCOPE_read]], User Attributes: [{id=60310151, username=null, resource_state=2, firstname=Marcos, lastname=Garcia, city=Chicago, state=Illinois, country=United States, sex=null, premium=false, summit=false, created_at=2020-06-03T11:18:54Z, updated_at=2020-07-07T16:10:35Z, badge_type_id=0, profile_medium=avatar/athlete/medium.png, profile=avatar/athlete/large.png, friend=null, follower=null}]; Credentials: [PROTECTED]; Authenticated: true; Details: org.springframework.security.web.authentication.WebAuthenticationDetails@0: RemoteIpAddress: 127.0.0.1; SessionId: 858ADB4064C6112BD3EE7909CA036E06; Granted Authorities: ROLE_USER, SCOPE_read

единственной возможностью была конфигурация, просмотр построчно, это было так же глупо, как не включать "/" в конце URL:

    tokenUri: https://www.strava.com/api/v3/oauth/token
0 голосов
/ 10 июля 2020

Глядя на ваш application.yml, я вижу, что вам не хватает атрибутов user-info-uri и user-name-attribute: поскольку это oauth2, а не oid c, Spring необходимо знать, может ли он найти пользователя и что Поле - уникальный идентификатор пользователя. Я бегло просмотрел документацию stravas api, думаю, это может быть так.

user-info-uri: https://www.strava.com/api/v3/athlete

user-name-attribute: id

Но вам может потребоваться проверить их документы или связаться с их службой поддержки, чтобы подтвердить, в основном вы просто ищете вызов API, который вернет сведения о пользователях и подтвердит, какое поле является уникальным идентификатором или именем пользователя пользователь.

...