OkHttp本身并不直接支持Digest认证,可以通过拦截器(Interceptor)来手动实现Digest认证的逻辑。
1、自定义Digest认证拦截器
@Slf4j
public class DigestAuthInterceptor implements Interceptor {
@NotNull
@Override
@SneakyThrows
public Response intercept(@NotNull Chain chain) {
Request original = chain.request();
String ha1 = calculateHA1(USERNAME, REALM, PASSWORD);
String method = original.method();
String url = original.url().toString();
String ha2 = calculateHA2(method, url);
String nonce = generateNonce();
String cNonce = generateNonce();
String response = calculateResponse(ha1, nonce, NONCE_COUNT, cNonce, QOP, ha2);
//构建Authorization头信息
String authHeader = "Digest username=\"" + USERNAME + "\",realm=\"" + REALM + "\",nonce=\"" + nonce + "\",uri=\"" + url + "\",nc=" + NONCE_COUNT + ",cnonce=\"" + cNonce + "\",qop=" + QOP + ",response=\"" + response + "\"";