使用HTTP AUTH需要在server端配置http auth信息, 其過(guò)程如下:
客戶端發(fā)送http請(qǐng)求
服務(wù)器發(fā)現(xiàn)配置了http auth, 于是檢查request里面有沒(méi)有”Authorization”的http header
如果有, 則判斷Authorization里面的內(nèi)容是否在用戶列表里面, Authorization header的典型數(shù)據(jù)為”Authorization: Basic jdhaHY0=”, 其中Basic表示基礎(chǔ)認(rèn)證, jdhaHY0=是base64編碼的”user:passwd”字符串. 如果沒(méi)有,或者用戶密碼不對(duì),則返回http code 401頁(yè)面給客戶端,并且在Response 的 header “WWW-Authenticate” 中添加信息.
標(biāo)準(zhǔn)的http瀏覽器在收到401頁(yè)面之后, 應(yīng)該彈出一個(gè)對(duì)話框讓用戶輸入帳號(hào)密碼; 并在用戶點(diǎn)確認(rèn)的時(shí)候再次發(fā)出請(qǐng)求, 這次請(qǐng)求里面將帶上Authorization header.
服務(wù)器將Authorization header中的用戶名密碼取出,進(jìn)行驗(yàn)證, 如果驗(yàn)證通過(guò),將根據(jù)請(qǐng)求,發(fā)送資源給客戶端。
OkHttp會(huì)自動(dòng)重試未驗(yàn)證的請(qǐng)求. 當(dāng)響應(yīng)是401 Not Authorized時(shí),Authenticator會(huì)被要求提供證書(shū). Authenticator的實(shí)現(xiàn)中需要建立一個(gè)新的包含證書(shū)的請(qǐng)求. 如果沒(méi)有證書(shū)可用, 返回null來(lái)跳過(guò)嘗試.
使用Response.challenges()來(lái)獲得任何authentication challenges的 schemes 和 realms. 當(dāng)完成一個(gè)Basic challenge, 使用Credentials.basic(username, password)來(lái)解碼請(qǐng)求頭.
public class BasicAuthInterceptor implements Interceptor {
private String credentials;
public BasicAuthInterceptor(String user, String password) {
this.credentials = Credentials.basic(user, password);
}
@Override
public Response intercept(Chain chain) throws IOException {
Request request = chain.request();
Request authenticatedRequest = request.newBuilder()
.header("Authorization", credentials).build();
return chain.proceed(authenticatedRequest);
}
}
OkHttpClient client = new OkHttpClient.Builder()
.addInterceptor(new BasicAuthInterceptor(username, paswd))
.build();
final Request request = new Request.Builder()
.url(url)
.post(body)
.build();
Response response = client.newCall(request).execute();