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’]
}
}
}