如何使用android okhttp3通过socks5代理进行http请求并进行身份验证?

问题描述 投票:0回答:1

这是我的代码,但我总是收到 java.net.SocketException: SOCKS : 身份验证失败。事实上,我已经用socks5客户端测试了凭据,它们没问题。有件事让我烦恼,只有一个可能的值 Proxy.Type.SOCKS ,这对 SOCKS4 和 SOCKS5 没有区别,那么 okhttp 实际上支持 SOCKS5 代理吗?

String proxyHost="replace with host";
int proxyPort=replace with proxy port;
String username="replace with username";
String password="replace with password";
String url="https://api64.ipify.org?format=json";

    Proxy proxyTest = new Proxy(Proxy.Type.SOCKS,new InetSocketAddress(proxyHost, proxyPort));

    okhttp3.Authenticator proxyAuthenticator = new okhttp3.Authenticator() {
        @Nullable
        @Override
        public Request authenticate(@Nullable Route route, @NonNull Response response) throws IOException {
            String credential = Credentials.basic(username, password);
            return response.request().newBuilder()
                    .header("Proxy-Authorization", credential)
                    .build();
        }
    };

    OkHttpClient client = new OkHttpClient.Builder()
            .connectTimeout(60, TimeUnit.SECONDS)
            .writeTimeout(60, TimeUnit.SECONDS)
            .readTimeout(60, TimeUnit.SECONDS)
            .proxy(proxyTest).proxyAuthenticator(proxyAuthenticator).build();
   

    Request request = new Request.Builder()
            .url(url)
            .build();

    Response response = client.newCall(request).execute();
android okhttp socks5
1个回答
0
投票

您遇到的异常(java.net.SocketException:SOCKS:身份验证失败)表示 SOCKS 代理身份验证存在问题。以下是一些需要检查的事项和可能的解决方案:

检查代理凭证:

确保使用 SOCKS 代理所需的实际凭据正确设置用户名和密码变量。 验证代理主机和端口:

确保 proxyHost 和 proxyPort 变量设置为 SOCKS 代理的正确值。 更新代理类型:

根据您的代理类型,您可能需要尝试使用 Proxy.Type.HTTP 而不是 Proxy.Type.SOCKS,反之亦然,具体取决于您的代理服务器支持的类型。 调试代理身份验证:

打印出代理凭据以进行调试并检查它们是否设置正确:

System.out.println("Proxy Username: " + username);
System.out.println("Proxy Password: " + password);

在代码之外测试代理身份验证:

尝试将相同的代理凭据与支持 SOCKS 代理身份验证的工具或命令行实用程序一起使用,以确保凭据有效。 检查代理服务器配置:

验证您的 SOCKS 代理服务器是否配置为允许指定的用户名和密码。某些 SOCKS 代理可能需要额外配置才能启用身份验证。

代码的修改版本,带有更多可疑之处

// ... (your previous code)

Proxy proxyTest = new Proxy(Proxy.Type.SOCKS, new InetSocketAddress(proxyHost, proxyPort));

okhttp3.Authenticator proxyAuthenticator = new okhttp3.Authenticator() {
    @Nullable
    @Override
    public Request authenticate(@Nullable Route route, @NonNull Response response) throws IOException {
        String credential = Credentials.basic(username, password);
        System.out.println("Proxy-Authorization: " + credential);
        return response.request().newBuilder()
                .header("Proxy-Authorization", credential)
                .build();
    }
};

OkHttpClient client = new OkHttpClient.Builder()
        .connectTimeout(60, TimeUnit.SECONDS)
        .writeTimeout(60, TimeUnit.SECONDS)
        .readTimeout(60, TimeUnit.SECONDS)
        .proxy(proxyTest)
        .proxyAuthenticator(proxyAuthenticator)
        .build();

Request request = new Request.Builder()
        .url(url)
        .build();

Response response = client.newCall(request).execute();
© www.soinside.com 2019 - 2024. All rights reserved.