gpt4 book ai didi

java - 如何使用 Spring Boot/Spring Security 包装对 OAuth2 不记名 token 请求的调用?

转载 作者:行者123 更新时间:2023-12-02 03:19:00 25 4
gpt4 key购买 nike

我遇到了以下问题:为了访问在线 API,我需要进行身份验证。现在,我用自己的代码完成所有操作:

  1. 调用不记名 token 的 token URL
  2. 获取不记名 token
  3. 使用不记名 token 调用真实服务
  4. 获取结果

代码如下:

@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;
}
}

它可以工作,但我在每次调用时都浪费了对 token URL 的调用。这就是我希望它工作的方式:

  1. 调用真实服务
  2. 如果收到 401
    1. 调用不记名 token 的 token URL
    2. 获取不记名 token
    3. 使用不记名 token 调用服务
  3. 获取结果

我可以在我的代码中做到这一点,但我已经在使用 Spring Boot。我想知道如何实现这一目标。是否有现有的过滤器、拦截器等等?

感谢您的见解。

最佳答案

尝试使用OAuth2RestTemplate来自 Spring 安全。如果可能的话,它应该负责获取 token 并缓存它。它应该在配置文件中进行配置,并在调用 API 的任何地方注入(inject)。

关于java - 如何使用 Spring Boot/Spring Security 包装对 OAuth2 不记名 token 请求的调用?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39870461/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com