使用导航组件在身份验证器失败时导航到登录片段

时间:2019-07-25 13:29:05

标签: java android

我正在使用带有jetpack导航组件的android应用程序,该组件使用访问和刷新令牌进行身份验证。对于身份验证,我使用okhttp3拦截器和身份验证器。当身份验证器无法基于刷新令牌刷新访问令牌时,存在一种极端情况。发生这种情况时,应显示登录片段。

public class TokenAuthenticator implements Authenticator {

private AuthService authService;
private AppPreferences appPreferences;
private TokenInterceptor tokenInterceptor;

@Inject
public TokenAuthenticator(AuthService authService, AppPreferences appPreferences, TokenInterceptor tokenInterceptor) {
    this.authService = authService;
    this.appPreferences = appPreferences;
    this.tokenInterceptor = tokenInterceptor;
}

@Override
public Request authenticate(Route route, Response response) throws IOException {
    String refreshToken = appPreferences.getRefreshToken();

    if (refreshToken == null) {
        // Here we should navigate to login fragment
        return null;
    }

    AccessTokenByRefreshRequest accessTokenRequest = new AccessTokenByRefreshRequest(refreshToken);
    AccessToken accessToken = authService.getAccessTokenByRefreshToken(accessTokenRequest).execute().body();

    if (accessToken != null) {
        appPreferences.setAccessToken(accessToken.getAccessToken());
        tokenInterceptor.setAccessToken(accessToken.getAccessToken());
        return response.request().newBuilder()
                .header("Authorization", "Bearer " + accessToken.getAccessToken())
                .build();
    } else {
        // Here we should navigate to login fragment
        return null;
    }
}

当身份验证器失败时,导航到登录片段的正确方法是什么?我有一些选择:

  1. 将LiveData添加到身份验证器,以在失败时进行通知并观察所有其他片段。 (很多重复代码)
  2. 将LiveData添加到身份验证器,以在失败时进行通知并观察主机活动。 (我不确定是否可以导航到主机活动的登录片段)
  3. 以某种方式导航到Authenticator的登录片段(可能不是Authenticator的工作,也不确定我是否可以这样做)

0 个答案:

没有答案