Этот ответ сопровождается полным и рабочим образцом .
Может быть, вы откусываете больше, чем можете прожевать здесь?
Например:
.antMatchers(HttpMethod.OPTIONS, "/oauth/token").permitAll()
Конечная точка /oauth/token
должна оставаться защищенной.Это конечная точка на сервере авторизации, которая выдает токены аутентифицированным клиентам.Система, возможно, выйдет из строя с NullpointerException
или другими исключениями, если вы откроете ее, однако вышеупомянутая опция конфигурации указывает, что, возможно, вы немного запутались в том, как работает OAuth2.
Я бы порекомендовал сначалаполностью понимать сервер авторизации по сравнению с сервером ресурсов.Вы определенно можете объединить эти два параметра, но они будут иметь очень разные конечные точки.
Сервер авторизации - типичные конечные точки
/oauth/token - issues tokens
/oauth/authorize - issues authorization codes
/introspect - validates a token and returns token claims in a known format
Ресурс-сервер - это будут конечные точки вашего приложения, требующие Bearer
токеновНапример,
/account/123/debit
и эти конечные точки ожидают запрос без сохранения состояния с заголовком авторизации
Authorization: Bearer <token value here>
Контроллер для сервера ресурсов будет выглядеть следующим образом:
@PreAuthorize("hasRole('your-scope-role')")
@RequestMapping(value = "/hello")
@ResponseBody
public String hello(Principal principal) {
return "Hello to " + principal.getName();
}
Не стесняйтесь просматривать простой проект , который я создал для вас.
В дополнение к этому, я также рекомендую это видео на OAuth2 и OpenID Connect
В моем примере я настроил клиентов следующим образом:
@Override
public void configure(ClientDetailsServiceConfigurer clients) throws Exception {
InMemoryClientDetailsService clientDetails = new InMemoryClientDetailsService();
BaseClientDetails client = new BaseClientDetails(
"testclient",
null,
"testscope,USER,ADMIN",
"password",
null
);
client.setClientSecret(passwordEncoder.encode("secret"));
clientDetails.setClientDetailsStore(
Collections.singletonMap(
client.getClientId(),
client
)
);
clients.withClientDetails(clientDetails);
}
Посмотрите на этот простой тестовый пример, клиент использует http-базовую аутентификацию:
mvc.perform(
post("/oauth/token")
.header(HttpHeaders.CONTENT_TYPE, MediaType.APPLICATION_FORM_URLENCODED_VALUE)
.header(HttpHeaders.ACCEPT, MediaType.APPLICATION_JSON_VALUE)
.param("username", "admin")
.param("password", "password")
.param("grant_type", "password")
.param("response_type", "token")
.param("client_id", "testclient")
.header("Authorization", "Basic " + Base64.encodeBase64String("testclient:secret".getBytes()))
Это проверка подлинности клиента с использованием метода http-basic:
.header("Authorization", "Basic " + Base64.encodeBase64String("testclient:secret".getBytes()))