Android retrofit OAuth2認(rèn)證中更新token
最近在項目中接入worktile掠械,通過OAuth2授權(quán)得到接口。在網(wǎng)絡(luò)層封裝的時候遇到Token的一些問題,現(xiàn)在記錄下來技掏,希望大家能夠參考车伞,并且提出一些建議
-
為請求的Header添加Token
抵用獲取Token接口后,得到Token后坑资。將access_token與refresh_token保存到本地,并且用了靜態(tài)常量保存access_token穆端,方便后續(xù)添加到Header中
利用OKhttp的攔截器Interceptor袱贮,攔截請求,加入Token
private static Interceptor mInterceptor = new Interceptor() { @Override public okhttp3.Response intercept(Chain chain) throws IOException { Request request = chain.request() .newBuilder() .addHeader(ACCESS_TOKEN, OauthConstant.access_token) .build(); return chain.proceed(request); } } };
-
當(dāng)未授權(quán)時(401)時体啰,利用Authenticator進(jìn)行Token失效處理
public static Authenticator sTokenAuthenticator = new Authenticator() { @Override public Request authenticate(Route route,final Response response) throws IOException { service.refreshToken(refresh_token, Constants.Oauth.CLIENT_ID). subscribe(new Observer<Token>() { @Override public void onCompleted() { } @Override public void onError(Throwable e) { //TODO refresh token 也失效攒巍,返回重新登錄 OauthConstant.access_token = ""; } @Override public void onNext(Token token) { OauthConstant.access_token = token.getAccess_token(); SPManager.getInstance().setAccessToken(token.getAccess_token()); SPManager.getInstance().setRefreshToken(token.getRefresh_token()); } }); if (TextUtils.isEmpty(OauthConstant.access_token)){ return null; } Request request = response.request() .newBuilder() .addHeader(ACCESS_TOKEN, OauthConstant.access_token) .build(); return request; } };