gpt4 book ai didi

android - 刷新 token 时 Dagger 2 获得旧 token

转载 作者:行者123 更新时间:2023-11-29 18:36:25 25 4
gpt4 key购买 nike

我在使用 Dagger 2 时遇到问题。简而言之,如果 token 已过期,Dagger 2 会在我的 fragment 中进行注入(inject)。 TokenAuthenticator 请求保存在 SharedPreferences 中的新 token 。

我的 fragment 没有重新创建,dagger 2 使用过期的 token 而不是新 token 进行调用。

现在我将详细解释。

Dagger 2

我的 Dagger 2 逻辑很简单。

NetworkModule.java

@Provides
@Nullable
String provideAuthToken(Context context) {
return AccountUtils.getCurrentUserToken(context);
}

@Provides
AuthenticationInterceptor provideInterceptor(@Nullable String authToken) {
return new AuthenticationInterceptor(authToken);
}

@Provides
TokenAuthenticator provideAuthenticator(Context context, @Nullable String authToken) {
return new TokenAuthenticator(context, authToken);
}

@Provides
OkHttpClient.Builder provideOkHttpClientBuilder(AuthenticationInterceptor interceptor, TokenAuthenticator authenticator) {
OkHttpClient.Builder okHttpClientBuilder = new OkHttpClient.Builder();
okHttpClientBuilder.connectTimeout(15, TimeUnit.SECONDS);
okHttpClientBuilder.readTimeout(15, TimeUnit.SECONDS);
okHttpClientBuilder.writeTimeout(15, TimeUnit.SECONDS);
if (!okHttpClientBuilder.interceptors().contains(interceptor)) {
okHttpClientBuilder.addInterceptor(interceptor);
okHttpClientBuilder.authenticator(authenticator);
}
return okHttpClientBuilder;
}

它从 SharedPreferences 获取 token 并进行改造以调用 API..

改造调用

然后我对 API 进行简单调用(它是一个带有授权 token 的 GET)

ProfileFragment.java

@Inject
ViewModelFactory viewModelFactory;
UserViewModel userViewModel;

@Override
public void onAttach(Context context) {
((BaseApplication) context.getApplicationContext())
.getAppComponent()
.inject(this);
super.onAttach(context);
}

@Nullable
@Override
public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
View view = inflater.inflate(R.layout.fragment_profile, container, false);
...
userViewModel = ViewModelProviders.of(this, viewModelFactory).get(UserViewModel.class);
userViewModel.getUserInfoMutableLiveData().observe(this, this::consumeResponse);
...
}

private void consumeResponse(UserResponse userResponse) {
switch (userResponse.status) {
case LOADING:
showProgressBar();
break;
case SUCCESS:
handleSuccessResponse(userResponse.data);
break;
case ERROR:
dismissAll();
if (getActivity() != null) {
ResponseHelper.handleErrorResponse(getActivity(), userResponse.error,
mContainer, mMainContainer, this);
}
break;
}
}

刷新 token

现在让我解释一下发生了什么。

ProfileFragment 已创建,dagger 2 通过获取保存在 SharedPreferences 中的 token 使用注入(inject)来创建组件。

ProfileFragment 调用 API,它收到 401 错误代码,因为 token 已过期。

调用 TokenAuthenticatior 刷新 token ,它成功刷新 token 并将NEW token 保存在SharedPreferences中。

再次调用用户信息,但是,由于未重新创建 ProfileFragment,因此它使用具有旧 token 的相同依赖注入(inject)进行调用。它使用旧 token 调用 API,然后我们收到错误 401。

如果我现在离开此页面并返回,它会正常工作,因为它会再次执行依赖项注入(inject)并获取保存在 SharedPreferences 中的新 token 。

解决方案

  1. 这就是为什么我在考虑某种可以再次进行注入(inject)的方法。例如,重新创建配置文件 fragment ,但我认为这不是一个好主意。在使用 dagger 2 之前,我对此没有任何问题。

希望有人能帮忙。谢谢!

最佳答案

注入(inject)在当前作用域生命周期内改变的东西通常不是一个好主意,因为你不能再注入(inject)一些东西。一旦 token 变得无效,您就必须重新创建整个组件,在这种情况下,您还需要重新创建 fragment ,正如您所指出的那样。

更好的方法是让您的 TokenAuthenticatorAuthenticationInterceptor 依赖于 AccountUtils,然后它们可以根据需要读取和更新 token 。无需将 401 传播给用户,因为您可以静默刷新身份验证器中的 token 。

关于android - 刷新 token 时 Dagger 2 获得旧 token ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54159012/

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