Я попытался упростить код, поэтому удалил оболочку токена JWT и теперь использую функциональность Spring OAuth по умолчанию. Я наблюдал в журналах отладки сервера аутентификации, что в случае, когда я пытаюсь отправить заголовки из java, в запросе на стороне сервера аутентификации нет заголовков. Но при отправке запроса от почтальона заголовки видны.
Я пытаюсь выполнить / пользовательскую конечную точку из теста Java, используя RestTemplate, как это:
@Test
public void user() {
RestTemplate restTemplate = new RestTemplate();
HttpHeaders headers = new HttpHeaders();
String token = "11877200-61a4-4830-954e-b3530206bab9";
headers.set("Authorization", "Bearer " +token);
HttpEntity entity = new HttpEntity<>(headers);
ResponseEntity<String> exchange = restTemplate.exchange("http://localhost:8090/user", HttpMethod.GET, entity, String.class);
}
Моя конфигурация сервера авторизации выглядит следующим образом:
@Configuration
@EnableAuthorizationServer
@EnableGlobalMethodSecurity(securedEnabled = true)
class AuthServerConfiguration(@Lazy val authenticationManager : AuthenticationManager,
val customClientsDetailsService: CustomClientsDetailsService) : AuthorizationServerConfigurerAdapter() {
@Throws(Exception::class)
override fun configure(security: AuthorizationServerSecurityConfigurer?) {
security!!
.tokenKeyAccess("permitAll()")
.checkTokenAccess("permitAll()")
.passwordEncoder(BCryptPasswordEncoder())
}
@Throws(Exception::class)
override fun configure(clients: ClientDetailsServiceConfigurer?) {
clients!!
.withClientDetails(customClientsDetailsService)
}
override fun configure(endpoints: AuthorizationServerEndpointsConfigurer?) {
endpoints!!
.authenticationManager(this.authenticationManager)
.tokenStore(tokenStore())
}
@Bean
fun tokenStore(): TokenStore {
return InMemoryTokenStore()
}
}
Мой WebSecurityConfigurerAdapter на сервере аутентификации:
@Autowired
@Throws(Exception::class)
fun configureGlobal(auth: AuthenticationManagerBuilder) {
auth
.userDetailsService<UserDetailsService>(customUserDetailsService)
.passwordEncoder(BCryptPasswordEncoder())
}
override fun configure(http: HttpSecurity?) {
http!!
.headers()
.httpStrictTransportSecurity()
.disable()
}
@Bean
@Throws(Exception::class)
override fun authenticationManagerBean(): AuthenticationManager {
return super.authenticationManagerBean()
}
Запрос почтальона:
GET /user HTTP/1.1
Host: localhost:8090
Content-Type: application/json
Authorization: Bearer 7afcf301-c254-403b-a29b-5af0c42b80dc
cache-control: no-cache
Postman-Token: b0c4d661-20a3-49e3-958b-5cd9b1f08b15
Журналы с сервера авторизации с запросом почтальона:
2019-03-24 12:56:41.250 DEBUG 14028 --- [nio-8090-exec-3]
o.a.coyote.http11.Http11InputBuffer : Received [GET /user HTTP/1.1
Content-Type: application/json
cache-control: no-cache
Postman-Token: ada0bb04-a7a3-43d0-aa84-6ced621d1e82
Authorization: Bearer 7afcf301-c254-403b-a29b-5af0c42b80dc
User-Agent: PostmanRuntime/7.6.1
Accept: */*
Host: localhost:8090
cookie: JSESSIONID=D782EDCB40FADAD8A634D40D95C0A870
accept-encoding: gzip, deflate
Connection: keep-alive
]
Журналы из теста Java-клиента:
12:58:52.468 [main] DEBUG org.springframework.web.client.RestTemplate - HTTP GET http://localhost:8090/user
12:58:52.480 [main] DEBUG org.springframework.web.client.RestTemplate - Accept=[text/plain, application/json, application/*+json, */*]
12:58:52.525 [main] DEBUG org.springframework.web.client.RestTemplate - Writing [{accept-encoding=[gzip], authorization=[Bearer 7afcf301-c254-403b-a29b-5af0c42b80dc]}] with org.springframework.http.converter.json.MappingJackson2HttpMessageConverter
12:58:52.573 [main] DEBUG org.springframework.web.client.RestTemplate - Response 401 UNAUTHORIZED
org.springframework.web.client.HttpClientErrorException$Unauthorized: 401 null
Process finished with exit code -1
Журналы с сервера авторизации с тестовым запросом клиента java:
2019-03-24 13:03:01.399 DEBUG 14028 --- [nio-8090-exec-7]
o.a.coyote.http11.Http11InputBuffer : Received [GET /user HTTP/1.1
Accept: text/plain, application/json, application/*+json, */*
Content-Type: application/json;charset=UTF-8
User-Agent: Java/1.8.0_201
Host: localhost:8090
Connection: keep-alive
]