49 lines
1.6 KiB
Java
49 lines
1.6 KiB
Java
|
package net.schueller.peertube.network;
|
||
|
|
||
|
import androidx.annotation.NonNull;
|
||
|
import androidx.annotation.Nullable;
|
||
|
|
||
|
import okhttp3.Authenticator;
|
||
|
import okhttp3.Request;
|
||
|
import okhttp3.Response;
|
||
|
import okhttp3.Route;
|
||
|
|
||
|
public class AccessTokenAuthenticator implements Authenticator {
|
||
|
|
||
|
public AccessTokenAuthenticator() {
|
||
|
}
|
||
|
|
||
|
@Nullable
|
||
|
@Override
|
||
|
public Request authenticate(Route route, @NonNull Response response) {
|
||
|
Session session = Session.getInstance();
|
||
|
|
||
|
final String accessToken = session.getToken();
|
||
|
if (!isRequestWithAccessToken(response) || accessToken == null) {
|
||
|
return null;
|
||
|
}
|
||
|
synchronized (this) {
|
||
|
final String newAccessToken = session.getToken();
|
||
|
// Access token is refreshed in another thread.
|
||
|
if (!accessToken.equals(newAccessToken)) {
|
||
|
return newRequestWithAccessToken(response.request(), newAccessToken);
|
||
|
}
|
||
|
|
||
|
// Need to refresh an access token
|
||
|
final String updatedAccessToken = session.refreshAccessToken();
|
||
|
return newRequestWithAccessToken(response.request(), updatedAccessToken);
|
||
|
}
|
||
|
}
|
||
|
|
||
|
private boolean isRequestWithAccessToken(@NonNull Response response) {
|
||
|
String header = response.request().header("Authorization");
|
||
|
return header != null && header.startsWith("Bearer");
|
||
|
}
|
||
|
|
||
|
@NonNull
|
||
|
private Request newRequestWithAccessToken(@NonNull Request request, @NonNull String accessToken) {
|
||
|
return request.newBuilder()
|
||
|
.header("Authorization", accessToken)
|
||
|
.build();
|
||
|
}
|
||
|
}
|