当前位置: 首页 > 知识库问答 >
问题:

改型-HTTP失败:java。lang.IllegalStateException:尝试刷新令牌时关闭

益绯辞
2023-03-14

我需要通过改造应用编程接口刷新令牌。我想在拦截器中这样做。但是当我运行应用程序时,它不能完成请求。它返回HTTP FAILED:java.lang.IllegalStateExctive:关闭。我研究了很多信息,但我找不到解决方案。

我的客户

public class RestClient {

/* Singleton init */
private static RestClient instance = new RestClient();

public static RestClient getInstance() {
    return instance;
}

private final String TOKEN_PREFIX = "JWT ";
private String token;

public void setToken(String token) {

    this.token = token;
    api = create();
}

public void refreshToken(String token) {
    this.token = token;
}

public String getToken() {
    return token;
}

public String getTokenHeader() {
    return TOKEN_PREFIX + token;
}

private API api;

private RestClient() {
    api = create();
}

public API getApi() {
    return api;
}

private API create() {
    HttpLoggingInterceptor interceptor = new HttpLoggingInterceptor();
    interceptor.setLevel(HttpLoggingInterceptor.Level.BODY);
    OkHttpClient.Builder clientBuilder = new OkHttpClient.Builder()
            .addInterceptor(interceptor)
            .connectTimeout(1, TimeUnit.MINUTES)
            .writeTimeout(1, TimeUnit.MINUTES)
            .readTimeout(1, TimeUnit.MINUTES);


    if (token != null) {
        clientBuilder.addInterceptor(new AuthInterceptor(this, getTokenHeader()));
    }
    OkHttpClient client = clientBuilder.build();
    Gson gson = new GsonBuilder()
            .setLenient()
            .create();
    Retrofit retrofit = new Retrofit.Builder()
            .baseUrl(BuildConfig.API_URL)
            .client(client)
            .addCallAdapterFactory(RxJava2CallAdapterFactory.create())
            .addConverterFactory(GsonConverterFactory.create(gson))
            .build();
    return retrofit.create(API.class);
}}

我的AuthInterceptor我用它来刷新代币

public class AuthInterceptor implements Interceptor {
private String authValue;
private RestClient restClient;

public AuthInterceptor(RestClient restClient, String authValue) {
    this.restClient = restClient;
    this.authValue = authValue;
}


@Override
public Response intercept(Chain chain) throws IOException {
    Request original = chain.request();

    Request.Builder requestBuilder = original.newBuilder()
            .header("Authorization", authValue);

    Request request = requestBuilder.build();
    Response response = chain.proceed(request);
    if (response.body().string().equals("jwt expired")) {
        LoginRequest loginRequest = new LoginRequest();
        loginRequest.fbToken = AccessToken.getCurrentAccessToken().getToken();
        Call<LoginResponse> call = restClient.getApi().refreshToken(loginRequest);
        restClient.refreshToken(call.execute().body().token);
        Request newRequest = chain.request();
        newRequest = newRequest.newBuilder()
                .header("Authorization", restClient.getTokenHeader()).build();

        response = chain.proceed(newRequest);
    }
    return response;

}}

共有1个答案

孟均
2023-03-14

请尝试以下操作:

ResponseBody responseBodyCopy = response.peekBody(Long.MAX_VALUE);
responseBodyCopy.string();

对我很管用

 类似资料:
  • 我使用两种拦截器,一种是HttpLoggingInterceptor,另一种是我的自定义授权拦截器 我正在使用下面更新的改造版本库, 下面是代码 当我试图执行下面的代码时,在名为SynsynizationManager.kt的文件中,它会给我一个错误。 我的规则资源服务类在这里 调试后,我发现当调用下面的函数时,我得到了一个异常 我有以下错误 下面是屏幕截图,你们可以看到,我得到了文件的输出,但不

  • 我正在尝试从应用程序服务中获取Google的刷新令牌,但我不能。 日志说 2016-11-04T00:04:25 PID[500]收到的详细请求:获取https://noteappsvr.azurewebsites.net/.auth/login/google?access _ type = offline 2016-11-04t 00:04:25 PID[500]从https://account

  • 我试图建立一个类,它可以环绕。NET Google API,这样我就可以使用我以前获得的访问令牌来访问用户的Google驱动器。到目前为止,我只是试图让它工作,这样我就不需要刷新令牌(稍后会有更多)。最终目标是让某人通过我设置的web页面进行身份验证,通过直接调用Google Rest API(我将其存储在数据库中)获得访问令牌和刷新令牌。然后,他们可以请求将文件上载/下载到另一个页面上的驱动器上

  • 我正在使用Adal4jJava库。我已经有一个刷新令牌,但想根据刷新令牌获取访问令牌。 我有以下代码,但我不知道如何定义AuthenticationCallback 如何定义身份验证回调?

  • 授权服务器可以给Web应用客户端和本机应用程序客户端颁发刷新令牌。 刷新令牌在传输和储存时必须保持机密性,并只与授权服务器和刷新令牌被颁发的客户端共享。授权服务器必须维护刷新令牌和它被颁发给的客户端之间的绑定。刷新令牌必须只能使用带有RFC2818定义的服务器身份验证的1.6所述的TLS 传输。 授权服务器必须验证刷新令牌和客户端身份之间的绑定,无论客户端身份是否能被验证。当无法进行客户端身份验证

  • 刷新令牌是用于获取访问令牌的凭据。刷新令牌由授权服务器颁发给客户端,用于在当前访问令牌失效或过期时,获取一个新的访问令牌,或者获得相等或更窄范围的额外的访问令牌(访问令牌可能具有比资源所有者所授权的更短的生命周期和更少的权限)。颁发刷新令牌是可选的,由授权服务器决定。如果授权服务器颁发刷新令牌,在颁发访问令牌时它被包含在内(即图1中的步骤D)。 刷新令牌是一个代表由资源所有者给客户端许可的授权的字