繁体   English   中英

使用jersey 2客户端刷新OAuth令牌

[英]Refresh OAuth token with jersey 2 client

我当前正在将应用程序从jersey 1迁移到2。在旧应用程序中,我们为所有jersey客户端使用了ClientFilter ,该客户端ClientFilter器会自动刷新已过期的OAuth令牌,如下所示:

@Override
public ClientResponse handle(ClientRequest cr) {
  ClientResponse resp = getNext().handle(cr);
  if (resp.getStatus() == Status.UNAUTHORIZED.getStatusCode()) {
    // Try to refresh the token
    boolean refreshed = refreshToken(oAuthInfo);
    if (refreshed) {
      resp = getNext().handle(cr);
    }
  }
  return resp;
}

它可能不是最优雅的方式,但是好处是其余的客户端用户不必自己关心过期的令牌。

使用针对球衣2的ContainerResponseFilter ,这似乎不再那么简单了。 我目前看到的唯一选项是使用ClientRequestContext并尝试使用getClientgetHeaders等重新创建原始请求,然后在ContainerResponseContext更新结果。 但是,这似乎有些笨拙,所以我想知道是否有更方便的方法可以刷新OAuth令牌,而不必在使用jersey客户端的任何地方进行处理?

似乎没有比使用客户端过滤器截取响应,在需要时刷新令牌并尝试使用新令牌重复完全相同的请求的方法更方便的方法。 实际上,球衣自己的过滤器类也使用此方法。

jerseys HttpAuthenticationFilter中可以找到用于从过滤器类中重复原始rest调用的示例代码:

static boolean repeatRequest(ClientRequestContext request, ClientResponseContext response, String newAuthorizationHeader) {
    Client client = request.getClient();

    String method = request.getMethod();
    MediaType mediaType = request.getMediaType();
    URI lUri = request.getUri();

    WebTarget resourceTarget = client.target(lUri);

    Invocation.Builder builder = resourceTarget.request(mediaType);

    MultivaluedMap<String, Object> newHeaders = new MultivaluedHashMap<String, Object>();

    for (Map.Entry<String, List<Object>> entry : request.getHeaders().entrySet()) {
        if (HttpHeaders.AUTHORIZATION.equals(entry.getKey())) {
            continue;
        }
        newHeaders.put(entry.getKey(), entry.getValue());
    }

    newHeaders.add(HttpHeaders.AUTHORIZATION, newAuthorizationHeader);
    builder.headers(newHeaders);

    builder.property(REQUEST_PROPERTY_FILTER_REUSED, "true");

    Invocation invocation;
    if (request.getEntity() == null) {
        invocation = builder.build(method);
    } else {
        invocation = builder.build(method,
                Entity.entity(request.getEntity(), request.getMediaType()));
    }
    Response nextResponse = invocation.invoke();

    if (nextResponse.hasEntity()) {
        response.setEntityStream(nextResponse.readEntity(InputStream.class));
    }
    MultivaluedMap<String, String> headers = response.getHeaders();
    headers.clear();
    headers.putAll(nextResponse.getStringHeaders());
    response.setStatus(nextResponse.getStatus());

    return response.getStatus() != Response.Status.UNAUTHORIZED.getStatusCode();
}

例如,在DigestAuthenticatorBasicAuthenticator中使用此代码,以在从服务器接收到Unauthorised响应的情况下,使用提供的凭据重复请求。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM