Как проверить токен доступа OAuth2 с сервера ресурсов
У меня есть сервер авторизации и сервер ресурсов как два разных объекта. Я вызываю REST API с токеном доступа в заголовке. Я хочу проверить действительность АТ, активен он или нет?
Я немного погуглил и обнаружил, что мы можем проверить токен доступа, используя конечную точку самоанализа токена, для которой также требуются ClientID и clientsecret. Но в остальном API я не передаю эту информацию (т.е. clientID и clientsecret).
2 ответа
Ответ будет зависеть от формата токена доступа. Если это JWT, что является предпочтительным вариантом, используйте код, подобный этому:
@Configuration
public class SecurityConfiguration {
@Bean
public SecurityFilterChain filterChain(final HttpSecurity http) throws Exception {
http
.antMatcher("/api/**")
.authorizeRequests(authz -> authz
.anyRequest().authenticated())
.oauth2ResourceServer().jwt();
return http.build();
}
}
Наряду с конфигурацией, подобной этой:
spring:
security:
oauth2:
resourceserver:
jwt:
jwk-set-uri: https://login.example.com/.well-known/jwks.json
САМОСПЕКЦИЯ
Если ваш API получает ссылочный токен, например, в формате UUID, вместо этого потребуется самоанализ.
Spring имеет аналогичный вариант для реализации этого, хотя чаще это делается в шлюзе API, размещенном перед API, а не в собственном коде API.
Интроспекция обычно сопровождается кешированием результата интроспекции, чтобы не забивать сервер авторизации, который обычно является критическим компонентом.
Во-первых, лучше понять типы аутентификации, IDP, типы токенов и типы грантов, шлюзы API, чтобы получить четкое представление о потоке аутентификации высокого уровня.
В структуре OAuth[1] существуют разные типы грантов.
Тип предоставления учетных данных клиента[2] — это один из типов предоставления.
Если вам необходимо следовать стандартному механизму проверки подлинности, лучше использовать поставщика удостоверений для создания токенов и их проверки. (Можно реализовать самостоятельно, но проще использовать уже реализованный)
Существуют различные типы типов токенов.
JWT[3] — это автономные токены. Идеально использовать токены доступа JWT в качестве учетных данных API, поскольку токены доступа JWT могут содержать утверждения (данные), которые используются для проверки подлинности и авторизации запросов. Для этого не нужна конечная точка самоанализа, поскольку сам токен содержит информацию для проверки токена.
Непрозрачные токены доступа[4] — непрозрачный или ссылочный токен — это случайная и уникальная строка символов, которая была выдана службой токенов в качестве идентификатора для использования в целях аутентификации API. Эти токены не несут никакой информации, связанной с пользователем, поэтому необходимо открыть обратный канал для службы проверки токена, чтобы проверить его и получить информацию о токене. Для этого ему нужна конечная точка самоанализа
Для защиты ваших API будет легко использовать уже разработанный шлюз API (существует множество шлюзов API[5]). Интеграция шлюза API с вашими API предоставит возможность повысить безопасность ваших API. Благодаря этому вам не нужно беспокоиться о реализации аутентификации для ваших API.
[1] https://is.docs.wso2.com/en/6.0.0/references/concepts/authorization/grant-types/
[2] https://is.docs.wso2.com/en/6.0.0/references/concepts/authorization/client-credential-grant/
[3] https://apim.docs.wso2.com/en/latest/design/api-security/oauth2/access-token-types/jwt-tokens/
[4] https://apim.docs.wso2.com/en/3.1.0/learn/api-security/oauth2/access-token-types/opaque-tokens/
[5] https://apim.docs.wso2.com/en/latest/get-started/overview/