Я пытаюсь программно получить токен доступа OAuth с моего сервера авторизации OAuth.Я могу получить токен, выполнив следующие действия:
Прямой браузер для http://localhost:8080/oauth/authorize?client_id=clientId&response_type=code&redirect_uri=http://localhost:10000/client/landing Эта конечная точка требует аутентификации для доступа, поэтому браузер перенаправляется в форму входа,где я ввожу имя пользователя и пароль, которые подтверждаются созданной мной службой пользовательских сведений о пользователе.
Браузер теперь находится на странице, которая проверяет, какие области я хочу предоставить клиенту для доступа к моим защищенным ресурсам.Я делаю свой выбор и нажимаю кнопку авторизации.
Браузер теперь перенаправлен на предоставленный URI перенаправления с кодом авторизации в качестве параметра запроса.(Например, http://localhost:10000/client/landing?code=J23Dxx)
Затем я беру параметр кода и использую его в POST (в почтальоне) для конечной точки / oauth / token. (Например, localhost: 8080 / oauth / token?grant_type = authorization_code & username = clientId & password = clientSecret & code = J23Dxx & redirect_uri = http://localhost:10000/client/landing)
Возвращает токен доступа, и все в порядке.
Проблемавозникает, когда я пытаюсь получить доступ к токену, используя OAuth2RestTemplate из моего клиентского приложения. Вот мой класс конфигурации клиента:
@Configuration
@EnableOAuth2Client
public class ClientConfig {
@Value("${app.clientId}")
private String clientId;
@Value("${app.clientSecret}")
private String clientSecret;
@Value("${app.resourceId}")
private String resourceId;
@Value("${app.clientAuthUri}")
private String clientAuthUri;
@Value("${app.tokenUri}")
private String tokenUri;
@Value("${app.directUri}")
private String redirectUri;
@Bean
public OAuth2ProtectedResourceDetails getResourceDetails() {
AuthorizationCodeResourceDetails details = new AuthorizationCodeResourceDetails();
details.setId(resourceId);
details.setClientId(clientId);
details.setClientSecret(clientSecret);
details.setScope(Arrays.asList("read", "write"));
details.setUserAuthorizationUri(clientAuthUri);
details.setAccessTokenUri(tokenUri);
details.setPreEstablishedRedirectUri(redirectUri);
details.setUseCurrentUri(false);
return details;
}
@Autowired
private OAuth2ClientContext oAuth2ClientContext;
@Bean
public OAuth2RestOperations oAuthTemplate(OAuth2ClientContext clientContext) {
OAuth2RestTemplate template = new OAuth2RestTemplate(getResourceDetails(), oAuth2ClientContext);
return template;
}
}
Затем я пытаюсь получить токен доступа, используя шаблон отдыха OAuth:
@Service
public class OAuthService {
@Autowired
private OAuth2RestOperations oauthTemplate;
public OAuth2AccessToken getToken() {
return oauthTemplate.getAccessToken();
}
}
Запуск метода getToken () приводит к исключению InsufficientAuthenticationException, что имеет смысл, поскольку я не ввел имя пользователя и пароль для доступа к конечной точке oauth / authorize. Но поскольку я использую поток кода авторизации, задаю имя пользователя &пароль в подробностях ресурса не вариант. Я попытался получить токен после перехода к конечной точке oauth / authorize таким же образом, но вВ этом случае я получаю ошибку о возможной атаке CSRF, которая, как я полагаю, связана с тем, что сервер авторизации ожидает параметр состояния в запросе токена.Поскольку конечная точка oauth / authorize была обработана браузером, а конечная точка токена была получена из OAuth2RestTemplate, от авторизации не сохраняется никакого состояния.
Как использовать OAuth2RestTemplate для доступа к моему токену или есть более фундаментальныепроблемы с моим дизайном, которые мешают этому работать?
Я удивлен, что я не нахожу больше информации об этом.Я ошибаюсь, полагая, что требование аутентификации для конечных точек авторизации и токена является рекомендуемой практикой?Каков стандартный способ использования OAuth2RestTemplate в случае, когда необходима аутентификация, прежде чем будут рассмотрены детали ресурса?