Я пытаюсь получить базовый сервер OAuth2 с памятью, работающий с использованием библиотек Spring. Я следил за пример sparklr.
В настоящее время я настроил сервер, и почти все работает, однако я не могу получить доступ к моему ограниченному ресурсу с сервера ресурсов.
Мой тестовый рабочий процесс:
-
Доступ к авторизованному URI, установленному oauth, для запуска потока OAuth2: http://localhost:8080/server/oauth/authorize?response_type=code&client_id=client
-
Перенаправление на страницу входа: http://localhost:8080/server/login
-
Обращайтесь к утверждению и перенаправляйтесь на мою настроенную страницу перенаправления с параметром кода: http://localhost:8080/client?code=HMJO4K
-
Создайте запрос GET с помощью Basic Auth, используя идентификатор клиента и секрет, а также тип и код гранта: http://localhost:8080/server/oauth/token?grant_type=authorization_code&code=HMJO4K
-
Получить обратный_объект и обновить токен в обратном
{ access_token: "f853bcc5-7801-42d3-9cb8-303fc67b0453" token_type: "предъявитель" refresh_token: "57100377-dea9-4df0-adab-62e33f2a1b49" expires_in: 299 scope: "read write" }
-
Попытка доступа к ограниченному ресурсу с помощью access_token: http://localhost:8080/server/me?access_token=f853bcc5-7801-42d3-9cb8-303fc67b0453
-
Получить неверный ответ на токен
{ Ошибка: "invalid_token" error_description: "Недействительный токен доступа: f853bcc5-7801-42d3-9cb8-303fc67b0453" }
-
POST для токена uri снова, чтобы обновить токен: http://localhost:8080/server/oauth/token?grant_type=refresh_token&refresh_token=57100377-dea9-4df0-adab-62e33f2a1b49
-
Получить новый токен
{ access_token: "ed104994-899c-4cd9-8860-43d5689a9420" token_type: "предъявитель" refresh_token: "57100377-dea9-4df0-adab-62e33f2a1b49" expires_in: 300 scope: "read write" }
Я действительно не уверен, что я делаю неправильно, но похоже, что все, кроме доступа к ограниченному uri, работает. Вот моя конфигурация:
@Configuration
public class Oauth2ServerConfiguration {
private static final String SERVER_RESOURCE_ID = "oauth2-server";
@Configuration
@EnableResourceServer
protected static class ResourceServerConfiguration extends ResourceServerConfigurerAdapter {
@Override
public void configure(ResourceServerSecurityConfigurer resources) {
resources.resourceId(SERVER_RESOURCE_ID);
}
@Override
public void configure(HttpSecurity http) throws Exception {
http
.sessionManagement()
.sessionCreationPolicy(SessionCreationPolicy.IF_REQUIRED)
.and().requestMatchers()
.antMatchers("/me")
.and().authorizeRequests()
.antMatchers("/me").access("#oauth2.clientHasRole('ROLE_CLIENT')")
;
}
}
@Configuration
@EnableAuthorizationServer
protected static class AuthotizationServerConfiguration extends AuthorizationServerConfigurerAdapter {
@Autowired
private ClientDetailsService clientDetailsService;
@Autowired
@Qualifier("authenticationManagerBean")
private AuthenticationManager authenticationManager;
@Override
public void configure(ClientDetailsServiceConfigurer clients) throws Exception {
clients.inMemory()
.withClient("client")
.resourceIds(SERVER_RESOURCE_ID)
.secret("secret")
.authorizedGrantTypes("authorization_code", "refresh_token")
.authorities("ROLE_CLIENT")
.scopes("read","write")
.redirectUris("http://localhost:8080/client")
.accessTokenValiditySeconds(300)
.autoApprove(true)
;
}
@Bean
public TokenStore tokenStore() {
return new InMemoryTokenStore();
}
@Override
public void configure(AuthorizationServerEndpointsConfigurer endpoints) throws Exception {
endpoints
.tokenStore(tokenStore())
.userApprovalHandler(userApprovalHandler())
.authenticationManager(authenticationManager)
;
}
@Override
public void configure(AuthorizationServerSecurityConfigurer oauthServer) throws Exception {
oauthServer.realm("oauth");
}
@Bean
public ApprovalStore approvalStore() throws Exception {
TokenApprovalStore store = new TokenApprovalStore();
store.setTokenStore(tokenStore());
return store;
}
@Bean
public UserApprovalHandler userApprovalHandler() throws Exception {
TokenStoreUserApprovalHandler handler = new TokenStoreUserApprovalHandler();
handler.setRequestFactory(new DefaultOAuth2RequestFactory(clientDetailsService));
handler.setClientDetailsService(clientDetailsService);
handler.setTokenStore(tokenStore());
return handler;
}
}
}
Есть ли что-то, что у меня пропало, или я приближаюсь к этому неправильно? Любая помощь будет принята с благодарностью.