当前位置: 首页 > 知识库问答 >
问题:

Android OkHttp与基本认证

云凌
2023-03-14

我正在为一个新项目使用OkHttp库,它的易用性给我留下了深刻的印象。我现在需要使用基本身份验证。不幸的是,缺少可用的示例代码。我正在寻找一个示例,说明在遇到HTTP 401头时如何将用户名/密码凭据传递给OkAuthenticator。我看到了这个答案:

改装带有基本HTTP身份验证的POST请求:“无法重试流式HTTP正文”

但这并没有让我走得太远。OkHttp github repo上的示例也没有基于身份验证的示例。有没有人有一个要点或其他代码示例可以让我指出正确的方向?谢谢你的帮助!

共有3个答案

罗乐意
2023-03-14

以下是更新的代码:

client.setAuthenticator(new Authenticator() {
  @Override
  public Request authenticate(Proxy proxy, Response response) throws IOException {
    String credential = Credentials.basic("scott", "tiger");
    return response.request().newBuilder().header("Authorization", credential).build();
  }

  @Override
  public Request authenticateProxy(Proxy proxy, Response response) throws IOException {
    return null;
  }
})
哈沛
2023-03-14

正如@agamov所指出的:

上述解决方案有一个缺点:http客户端仅在收到401响应后才添加授权头

@阿加莫夫随后建议“手动”为每个请求添加身份验证头,但有一个更好的解决方案:使用拦截器

import java.io.IOException;
import okhttp3.Credentials;
import okhttp3.Interceptor;
import okhttp3.Request;
import okhttp3.Response;

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);
    }

}

然后,只需将拦截器添加到OkHttp客户端,您将使用该客户端发出所有经过身份验证的请求:

OkHttpClient client = new OkHttpClient.Builder()
    .addInterceptor(new BasicAuthInterceptor(username, password))
    .build();

元玮
2023-03-14
import okhttp3.Authenticator;
import okhttp3.Credentials;
import okhttp3.MediaType;
import okhttp3.OkHttpClient;
import okhttp3.Request;
import okhttp3.Response;
import okhttp3.Route;

public class NetworkUtil {

private final OkHttpClient.Builder client;

{
    client = new OkHttpClient.Builder();
    client.authenticator(new Authenticator() {
        @Override
        public Request authenticate(Route route, Response response) throws IOException {
            if (responseCount(response) >= 3) {
                return null; // If we've failed 3 times, give up. - in real life, never give up!!
            }
            String credential = Credentials.basic("name", "password");
            return response.request().newBuilder().header("Authorization", credential).build();
        }
    });
    client.connectTimeout(10, TimeUnit.SECONDS);
    client.writeTimeout(10, TimeUnit.SECONDS);
    client.readTimeout(30, TimeUnit.SECONDS);
}

private int responseCount(Response response) {
    int result = 1;
    while ((response = response.priorResponse()) != null) {
        result++;
    }
    return result;
}

}
 类似资料:
  • Marathon可以通过SSL进行API端点的安全访问也恶意通过HTTP基本接入认证进行有限访问。如果计划使用基本认证方式,我们建议使用SSL方式,因为其他方式由于用户名和密码未被加密,信息容易被其他方获取。 Enabling SSL##使用SSL 如果已经有了Java keystore,可以将其连通密码一起通过SSL传递至Marathon $ cd /path/to/marathon $ ./b

  • 基本认证在 Web 应用中是非常流行的认证机制。 基本身份验证通常用于无状态客户端,它们在每个请求中传递其凭证。 将其与基于表单的认证结合使用是很常见的,其中通过基于浏览器的用户界面和作为Web服务来使用应用。 但是,基本认证将密码作为纯文本传输,是不安全的,所以它只能在真正通过加密的传输层(如HTTPS)中使用。 在 jpa-userdetailsservice项目的基础上,我们构建了一个bas

  • 我开发了一个spring启动应用程序。当我需要执行REST请求时(POST、PUT…)我每次都使用这样的基本身份验证 有没有另一种方法可以在应用程序中进行一次基本身份验证,然后在没有基本身份验证的情况下使用RestTem板或http Post{放/删除...}? 顺致敬意,

  • 我目前正在运行一个Node.js应用程序,有一个应用程序接口和文件服务(我知道nginx可以处理它,但我一开始不应该使用它)。 我只是用它来做一个简单的基本认证,碰巧没那么简单。 这是我的nginx配置: 文件只是,很好。 使用此配置,当我转到我的IP时: 询问我用户和密码 开始加载页面 (有时)再次询问用户和密码 完成以加载页面 到目前为止还不错,即使它问了两次密码。 Node.js应用程序具有

  • 问题内容: 我正在尝试使用Spring Security做一个非常简单的基本身份验证。我已经正确配置了名称空间,并且服务器中没有异常。在我的“ servlet.xml”中,我获得了Spring Security的下一个: 几乎一切都完美了:没有的方法不会提示任何登录表单,而方法会提示它。问题是,或者,都不能登录那里。谁能看到我在做什么错? 提前致谢!;-) 问题答案: 自动应答 T_T为此,我花了

  • BasicAuth (基本认证) 中间件 BasicAuth 中间件提供了 HTTP 的基本认证方式。 对于有效的请求则继续执行后面的处理。 对于无效的请求,返回”401 - Unauthorized”响应。 用法 e.Use(middleware.BasicAuth(func(username, password string, c echo.Context) (bool, error) {