【问题标题】: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;
  }

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-08-28
    • 1970-01-01
    • 2016-07-06
    • 1970-01-01
    • 2021-02-03
    • 2016-06-29
    • 2015-07-21
    • 2016-10-28
    相关资源
    最近更新 更多