私は次の問題を抱えています。オンラインAPIにアクセスするには、認証を取得する必要があります。今、私は自分自身のコードですべての操作を行います。OAuth2ベアラトークン要求にコールをラップするためにSpring Boot/Spring Securityを使用するにはどうすればよいですか?
- コール
- が結果を取得
- コールトークンベアラ
- と実際のサービストークンベアラーを取得したトークンベアラのトークンURLを ここで
はコードです:
@RestController
public class RandomController {
private final Random random;
public RandomController(Random random) {
this.random = random;
}
@RequestMapping(value = "/get", method = GET)
public int random(@RequestParam(value = "limit", defaultValue = "100") int limit) {
String bearerToken = getBearerToken();
int[] bounds = getBounds(bearerToken);
return computeRandom(bounds[0], bounds[1]);
}
private String getBearerToken() {
RestTemplate tokenTemplate = new RestTemplate();
MultiValueMap<String, String> body = new LinkedMultiValueMap<>();
body.add("client_id", "my id");
body.add("client_secret", "my secret");
body.add("grant_type", "client_credentials");
HttpHeaders headers = new HttpHeaders();
headers.add("Accept", "application/json");
HttpEntity<?> entity = new HttpEntity<>(body, headers);
ResponseEntity<String> res = tokenTemplate.exchange(
"https://bearer.token/get", POST, entity, String.class);
Map<String, Object> map = new BasicJsonParser().parseMap(res.getBody());
return (String) map.get("access_token");
}
private int[] getBounds(String bearerToken) {
RestTemplate configurationTemplate = new RestTemplate();
HttpHeaders headers = new HttpHeaders();
headers.add("Authorization", "Bearer " + bearerToken);
HttpEntity<?> entity = new HttpEntity<>(headers);
ResponseEntity<String> res = configurationTemplate.exchange(
"https://configurations.com/bounds", HttpMethod.GET, entity, String.class);
Map<String, Object> map = new BasicJsonParser().parseMap(res.getBody());
Map<String, Long> value = (Map<String, Long>) map.get("value");
int lowerBound = value.get("lower").intValue();
int upperBound = value.get("upper").intValue();
return new int[]{lowerBound, upperBound};
}
private int computeRandom(int lowerBound, int upperBound) {
int difference = upperBound - lowerBound;
int raw = random.nextInt(difference);
return raw + lowerBound;
}
}
それは動作しますが、すべての呼び出しでトークンURLへの呼び出しを無駄にしています。これは、私はそれが動作したい方法です:401
- を得ることが
- トークンベアラのトークンURLが ベアラがトークンを取得呼び出す場合
- は、実際のサービス
- を呼び出し
- ベアラトークンを使用したサービスを呼び出す
私は自分のコードでそれを行うことができましたが、私はすでにSpring Bootを使用しています。私はそれを達成する方法が不思議です。既存のフィルタ、インターセプタなどはありますか?
あなたの洞察をお寄せいただきありがとうございます。
私はあなたの答えをアップアップします:a)それは唯一のものです - ありがとう:) b)それは正しい方向に転がりました。 まだ、私はより詳細な何かを期待していました。私は最終的に私が最小限のコードで欲しいものを達成する方法を見つけました。ドキュメンテーションのために、私は自分の質問に答えていきます。 – Nicolas