【问题标题】:Oauth2 in a Proxy代理中的 Oauth2
【发布时间】:2020-06-09 15:45:06
【问题描述】:
我需要构建一种处理 OAuth2 流的 Java Proxy+。想法是登录此“代理+”并执行 OAuth2 流程,直到代理+收到令牌 + 刷新令牌。
之后,您使用用户名和密码或其他可以为您提供会话的东西登录到 Proxy+。代理通常会处理您的所有 Web 请求,并将 Oauth2 令牌添加到每个请求。如有必要,还可以刷新令牌。
您将如何实现接收和增强请求以及请求令牌刷新的代理部分。这个问题与 OAuth2 流程无关,也与如何首先获取令牌无关。
我想我尝试了一个 servlet 过滤器来拦截所有请求并增强请求。这样它对所有调用的 url 也是通用的。有更好的想法吗?
【问题讨论】:
标签:
oauth-2.0
servlet-filters
【解决方案1】:
找到了一个更好的方法,这是通用代理的 Spring 方式 :-)
@RequestMapping("/**")
public ResponseEntity<byte[]> genericRequest(RequestEntity<?> inboundRequestEntity, HttpServletRequest request) {
URI outboundUri = UriComponentsBuilder.fromHttpUrl(this.targetBaseUrl)
.path(removeUrlPart(request))
.query(request.getQueryString())
.build(true)
.toUri();
HttpHeaders headers = filterHeaders(inboundRequestEntity.getHeaders());
BodyBuilder builder = RequestEntity
.method(requireNonNull(inboundRequestEntity.getMethod()), outboundUri)
.headers(headers);
RequestEntity<?> outboundRequestEntity = inboundRequestEntity.hasBody() ? builder.body(requireNonNull(inboundRequestEntity.getBody())) : builder.build();
try {
LOGGER.info("Will call url '{}' with method '{}'", outboundRequestEntity.getUrl(), outboundRequestEntity.getMethod());
ResponseEntity<byte[]> responseEntity = this.restTemplate.exchange(outboundRequestEntity);
return ResponseEntity.status(responseEntity.getStatusCode())
.headers(filterHeaders(responseEntity.getHeaders()))
.body(responseEntity.getBody());
} catch (
HttpStatusCodeException e) {
return ResponseEntity.status(e.getRawStatusCode())
.headers(filterHeaders(e.getResponseHeaders()))
.body(e.getResponseBodyAsByteArray());
}
}
private static HttpHeaders filterHeaders(HttpHeaders originalHeaders) {
HttpHeaders filteredResponseHeaders = new HttpHeaders();
filteredResponseHeaders.putAll(originalHeaders);
filteredResponseHeaders.remove(CONTENT_LENGTH);
filteredResponseHeaders.remove(DATE);
return filteredResponseHeaders;
}