OAuth 1.0を使用して一部のリソースを保護する外部パートナーがあります。私はこのリソースにアクセスする必要があり、私はSpring BootとSpring Security OAuthを使用してこれを行いたいと思います。私はXML設定を使いたくないので、Java設定ですべてを設定する方法を探しました。これを行う方法の例を示した0スレッドが見つかりました。しかし、OAuth 1.0のフローに関するサーバー側のことは私にとっては明らかではありません。SpringセキュリティOAuth 1.0フロー - コンシューマ検証
私のパートナーは、消費者トークン、request_token
エンドポイント、承認エンドポイント、access_token
エンドポイントを提供するエンドポイント、OAuthに4つのエンドポイントを提供します。私の現在の設定(下記参照)では、リクエストトークンを取得でき、認証エンドポイントが呼び出されます。しかし、認可エンドポイントは、確認を求めますが、URLをメールアドレスとパスワードをパラメータとして期待すると、資格情報をチェックした後、次を返していません:
oauth_verifier=a02ebdc5433242e2b6e582e17b84e313
をそしてOAuthのフローが立ち往生場所です。通常の流れのOAuth 1.0に関するいくつかの記事を読んだ後
はこれです:
- キー消費者のトークンは/承認のURLにリダイレクトすると尋ねる
request_token
エンドポイント - を経由して、消費者のトークンを使用してOAuthのトークンゲット確認のためのユーザ
- 検証者トークンを使用してコンシューマにリダイレクト
- 経由でアクセストークンを取得するためのユーザ検証ツールトークンとoauthトークンエンドポイント
まず、手順3と4はわかりません。私はSpring Security OAuth examplesを見つけましたが、アクセスを確認した後、ユーザー/検証者のトークンが消費者に返送される方法はわかりませんでした。誰かがこれがどのように行われたか説明してもらえますか?
2番目:パートナーのエンドポイントが確認を求めずに直ちにoauthベリファイアを返すことを考えれば、この設定でSpring Security OAuthをどのように使用できますか?私は、パートナーの認証エンドポイントを呼び出して何らかの形で私の消費者に検証者を知らせる独自の認証エンドポイントを実装することを考えていましたが、後者の方法をどうやって行うのか分かりません。ここ
コードは、(上述したスレッドの助けを借りて、ConsumerTokenDto
は、それが自明であるようにして残されている)、これまでのところです。
アプリケーション
@SpringBootApplication
public class Application {
public static void main(String[] args) {
SpringApplication.run(Application.class, args);
}
}
エンドポイント
@RestController
public class Endpoint {
@Autowired
private OAuthRestTemplate oAuthRestTemplate;
private String url = "https://....";
@RequestMapping("/public/v1/meters")
public String getMeters() {
try {
return oAuthRestTemplate.getForObject(URI.create(url), String.class);
} catch (Exception e) {
LOG.error("Exception", e);
return "";
}
}
}
OAuth configura
@Configuration
@EnableWebSecurity
public class OAuthConfig extends WebSecurityConfigurerAdapter {
@Autowired
private RestTemplateBuilder restTemplateBuilder;
private ConsumerTokenDto consumerTokenDto;
private static final String ID = "meters";
@Override
protected void configure(HttpSecurity http) throws Exception {
http.authorizeRequests().antMatchers("/**").permitAll();
http.addFilterAfter(this.oauthConsumerContextFilter(), SwitchUserFilter.class);
http.addFilterAfter(this.oauthConsumerProcessingFilter(), OAuthConsumerContextFilterImpl.class);
}
private OAuthConsumerContextFilter oauthConsumerContextFilter() {
OAuthConsumerContextFilter filter = new OAuthConsumerContextFilter();
filter.setConsumerSupport(this.consumerSupport());
return filter;
}
private OAuthConsumerProcessingFilter oauthConsumerProcessingFilter() {
OAuthConsumerProcessingFilter filter = new OAuthConsumerProcessingFilter();
filter.setProtectedResourceDetailsService(this.prds());
LinkedHashMap<RequestMatcher, Collection<ConfigAttribute>> map = new LinkedHashMap<>();
// one entry per oauth:url element in xml
map.put(
new AntPathRequestMatcher("/public/v1/**", null),
Collections.singletonList(new SecurityConfig(ID)));
filter.setObjectDefinitionSource(new DefaultFilterInvocationSecurityMetadataSource(map));
return filter;
}
@Bean
OAuthConsumerSupport consumerSupport() {
CoreOAuthConsumerSupport consumerSupport = new CoreOAuthConsumerSupport();
consumerSupport.setProtectedResourceDetailsService(prds());
return consumerSupport;
}
@Bean
ProtectedResourceDetailsService prds() {
InMemoryProtectedResourceDetailsService service = new InMemoryProtectedResourceDetailsService();
Map<String, ProtectedResourceDetails> store = new HashMap<>();
store.put(ID, prd());
service.setResourceDetailsStore(store);
return service;
}
ProtectedResourceDetails prd() {
ConsumerTokenDto consumerToken = getConsumerToken();
BaseProtectedResourceDetails resourceDetails = new BaseProtectedResourceDetails();
resourceDetails.setId(ID);
resourceDetails.setConsumerKey(consumerToken.getKey());
resourceDetails.setSharedSecret(new SharedConsumerSecretImpl(consumerToken.getSecret()));
resourceDetails.setRequestTokenURL("https://.../request_token");
// the authorization URL does not prompt for confirmation but immediately returns an OAuth verifier
resourceDetails.setUserAuthorizationURL(
"https://.../authorize?email=mail&password=pw");
resourceDetails.setAccessTokenURL("https://.../access_token");
resourceDetails.setSignatureMethod(HMAC_SHA1SignatureMethod.SIGNATURE_NAME);
return resourceDetails;
}
// get consumer token from provider
private ConsumerTokenDto getConsumerToken() {
if (consumerTokenDto == null) {
MultiValueMap<String, String> body = new LinkedMultiValueMap<>();
body.add("client", "Client");
HttpHeaders headers = new HttpHeaders();
headers.setContentType(MediaType.APPLICATION_FORM_URLENCODED);
HttpEntity<MultiValueMap<String, String>> request = new HttpEntity<>(body, headers);
RestTemplate restTemplate = restTemplateBuilder.setConnectTimeout(1000).setReadTimeout(1000).build();
restTemplate.getInterceptors().add(interceptor);
restTemplate.setRequestFactory(new BufferingClientHttpRequestFactory(new SimpleClientHttpRequestFactory()));
ResponseEntity<ConsumerTokenDto> response = restTemplate
.exchange("https://.../consumer_token", HttpMethod.POST, request,
ConsumerTokenDto.class);
consumerTokenDto = response.getBody();
}
return consumerTokenDto;
}
// create oauth rest template
@Bean
public OAuthRestTemplate oAuthRestTemplate() {
OAuthRestTemplate oAuthRestTemplate = new OAuthRestTemplate(prd());
oAuthRestTemplate.getInterceptors().add(interceptor);
return oAuthRestTemplate;
}
}