Ввод учетных данных пользователя для потока кода авторизации Spring OAuth - PullRequest
0 голосов
/ 08 февраля 2019

Я пытаюсь программно получить токен доступа OAuth с моего сервера авторизации OAuth.Я могу получить токен, выполнив следующие действия:

  1. Прямой браузер для http://localhost:8080/oauth/authorize?client_id=clientId&response_type=code&redirect_uri=http://localhost:10000/client/landing Эта конечная точка требует аутентификации для доступа, поэтому браузер перенаправляется в форму входа,где я ввожу имя пользователя и пароль, которые подтверждаются созданной мной службой пользовательских сведений о пользователе.

  2. Браузер теперь находится на странице, которая проверяет, какие области я хочу предоставить клиенту для доступа к моим защищенным ресурсам.Я делаю свой выбор и нажимаю кнопку авторизации.

  3. Браузер теперь перенаправлен на предоставленный URI перенаправления с кодом авторизации в качестве параметра запроса.(Например, http://localhost:10000/client/landing?code=J23Dxx)

  4. Затем я беру параметр кода и использую его в POST (в почтальоне) для конечной точки / oauth / token. (Например, localhost: 8080 / oauth / token?grant_type = authorization_code & username = clientId & password = clientSecret & code = J23Dxx & redirect_uri = http://localhost:10000/client/landing)

  5. Возвращает токен доступа, и все в порядке.

Проблемавозникает, когда я пытаюсь получить доступ к токену, используя 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 в случае, когда необходима аутентификация, прежде чем будут рассмотрены детали ресурса?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...