I have the same problem in my app.
I’m using Spring Boot and Angular 8.
Here is my Response Header:
WWW-Authenticate: Bearer realm="oauth2-resource", error="invalid_token", error_description="Invalid access token: eyJraWQiOiJWb0ZXSnUxWUdSQlB6QUNhb2JKZml3WFVIZjRyOVctQVA1U3I0X05vY0ZvIiwiYWxnIjoiUlMyNTYifQ.eyJ2ZXIiOjEsImp0aSI6IkFULkFCeksxbWJQTkI4dFJvdjluRnF5Yi11N1VkMnJHQ3E0OGZacHl6a2prMzgiLCJpc3MiOiJodHRwczovL2ZwZm9rdGFucGkub2t0YS5jb20iLCJhdWQiOiJodHRwczovL2ZwZm9rdGFucGkub2t0YS5jb20iLCJzdWIiOiJyb2Jzb24ucmFtb3NAZnBmLmJyIiwiaWF0IjoxNTYzNTQ3MDYyLCJleHAiOjE1NjM1NTA2NjIsImNpZCI6IjBvYXlmdTBiMUlmSlNGMGdJMzU2IiwidWlkIjoiMDB1eTg4cmI2ZWV4RE9yWlIzNTYiLCJzY3AiOlsib3BlbmlkIiwiZW1haWwiXX0.mSkwtNFn9fUUejQ37Ka6fDDhuRT8ELDKyKQI83VEQieS3yUEbxDOqWqGOEaymy5pnzuhbByHcfBK_A3pTPA8i4c4omVEilr1oGAuoOBAWAWs-tvFYy_mpZ9Q8zaYSEpPLTKrPwVNORsdG2qHD-tZm7VuhqU1IgSxNJx3-AhVk-S3kL3KDxmJTUuVN3z7DNogQj8xR3z5PW-zH1B3pYR_abQdsqwAhnnez3ezRfMEwVf-iUHmg2J73WQqzn0d9MLtw2Pdqb4q8CJk3-doiLLcADAOyFezfRdT3iOR8GH84uMlBqMXl5Fgeh0e-yZcntaVPWb1hTE3rKw7z795EBHe1w"
is there any configuration missing from the app or Okta?
This is my configuration
Angular 8 App
auth-routing.module.ts
const oktaConfig = {
issuer: “https://fpfoktanpi.okta.com”,
redirectUri: window.location.origin + “/implicit/callback”,
clientId: “0oayfu0b1IfJSF0gI356”
};
service.ts
this.accessToken = await this.oktaAuth.getAccessToken();
httpOptions[“headers”] = new HttpHeaders({“Authorization”: "Bearer ".concat(this.accessToken)});
Spring Boot app:
@EnableResourceServer
@SpringBootApplication
@EnableJpaAuditing
@EnableJpaRepositories(
repositoryFactoryBeanClass = EnversRevisionRepositoryFactoryBean.class
)
public class TestApplication {
public static void main(String[] args) { SpringApplication.run(TestApplication.class, args); } @Bean @Order(Ordered.HIGHEST_PRECEDENCE) public CORSApplication getCORSApplication() { return new CORSApplication(); } @PostConstruct void started() { TimeZone.setDefault(TimeZone.getTimeZone("UTC")); } @Bean public FilterRegistrationBean<CorsFilter> simpleCorsFilter() { UrlBasedCorsConfigurationSource source = new UrlBasedCorsConfigurationSource(); CorsConfiguration config = new CorsConfiguration(); config.setAllowCredentials(true); config.setAllowedOrigins(Collections.singletonList("http://localhost:4200")); config.setAllowedMethods(Collections.singletonList("*")); config.setAllowedHeaders(Collections.singletonList("*")); source.registerCorsConfiguration("/**", config); FilterRegistrationBean<CorsFilter> bean = new FilterRegistrationBean<>(new CorsFilter(source)); bean.setOrder(Ordered.HIGHEST_PRECEDENCE); return bean; }
}
@EnableWebSecurity
public class SecurityConfiguration extends WebSecurityConfigurerAdapter {
@Override protected void configure(HttpSecurity http) throws Exception { // @formatter:off http .authorizeRequests().anyRequest().authenticated() .and() .oauth2ResourceServer().jwt(); // @formatter:on Okta.configureResourceServer401ResponseBody(http); }
}
application.yml
okta:
oauth2:
client-id: 0oayfu0b1IfJSF0gI356
issuer: https://fpfoktanpi.okta.com
build.gradle:
plugins {
id ‘org.springframework.boot’ version ‘2.1.5.RELEASE’
id ‘java’
id “org.liquibase.gradle” version “2.0.1”
id “net.ltgt.apt” version “0.20”
}
apply plugin: ‘io.spring.dependency-management’
apply plugin: ‘net.ltgt.apt-idea’
group = ‘com.fpf’
version = ‘1.4.0-BETA’
sourceCompatibility = ‘1.8’
configurations {
developmentOnly
runtimeClasspath {
extendsFrom developmentOnly
}
compileOnly {
extendsFrom annotationProcessor
}
}
repositories {
mavenCentral()
maven { url ‘https://repo.spring.io/snapshot’ }
maven { url ‘https://repo.spring.io/milestone’ }
}
File propsFile = new File("${projectDir}/src/main/resources/liquibase.properties")
Properties properties = new Properties()
properties.load(new FileInputStream(propsFile))
dependencies {
implementation ‘org.springframework.boot:spring-boot-starter-data-jpa’
implementation ‘org.springframework.boot:spring-boot-starter-validation’
implementation ‘org.springframework.boot:spring-boot-starter-web’
implementation ‘org.liquibase:liquibase-core’
implementation ‘org.springframework.data:spring-data-envers’
compileOnly ‘org.projectlombok:lombok’
developmentOnly ‘org.springframework.boot:spring-boot-devtools’
runtimeOnly ‘com.microsoft.sqlserver:mssql-jdbc’
annotationProcessor ‘org.projectlombok:lombok’
testImplementation ‘org.springframework.boot:spring-boot-starter-test’
compile “io.springfox:springfox-swagger2:2.9.2”
compile “io.springfox:springfox-swagger-ui:2.9.2”
compile group: ‘com.fasterxml.jackson.datatype’, name: ‘jackson-datatype-jsr310’, version: ‘2.9.8’
compile group: ‘org.apache.commons’, name: ‘commons-lang3’, version: ‘3.8.1’
compile group: ‘org.modelmapper’, name: ‘modelmapper’, version: ‘2.3.2’
compile group: 'com.okta.spring', name: 'okta-spring-boot-starter', version: '1.2.1' compile "org.springframework.security:spring-security-oauth2-client" compile 'org.springframework.boot:spring-boot-starter-security' compile "org.springframework.security.oauth.boot:spring-security-oauth2-autoconfigure:2.1.5.RELEASE" compileOnly group: 'org.hibernate', name: 'hibernate-jpamodelgen', version: '5.3.7.Final' annotationProcessor group: 'org.hibernate', name: 'hibernate-jpamodelgen', version: '5.3.7.Final' liquibaseRuntime group: 'org.liquibase.ext', name: 'liquibase-hibernate5', version: '3.6' liquibaseRuntime 'com.microsoft.sqlserver:mssql-jdbc' liquibaseRuntime 'org.liquibase:liquibase-core' liquibaseRuntime 'org.springframework.boot:spring-boot-starter-data-jpa' liquibaseRuntime sourceSets.main.output compile "com.google.auto.value:auto-value-annotations:1.6.2" annotationProcessor "com.google.auto.value:auto-value:1.6.2"
}
liquibase {
activities {
main {
driver properties[‘driver’]
url properties[‘url’]
changeLogFile properties[‘changeLogFile’]
referenceUrl properties[‘referenceUrl’]
username properties[‘username’]
password properties[‘password’]
}
}
}