retrofit - 带改造的基本身份验证

标签 retrofit basic-authentication

我正在尝试使用 Retrofit 为 REST API 构建客户端。 API 使用基本身份验证,我无法使用 Retrofit 进行身份验证。

我使用下面的curl测试了API,它按预期工作

curl  -H "Accept: application/json" -H "Content-type: application/json" -X POST -d '{some_json}' -u api_key: https://apitest.com/api/v1/customers

下面是Retrofit客户端

public interface UserService {

String HOST = "https://apitest.com";

public static OkHttpClient.Builder httpClient = new OkHttpClient.Builder();
public static Retrofit.Builder builder =
        new Retrofit.Builder()
                .baseUrl(HOST)
                .addConverterFactory(GsonConverterFactory.create());
/*
 * CREATE/UPDATE User
 */
@POST("api/v1/customers")
Call<UserAPIResponse> userUpdate(@Body UserUpdateRequest userUpdateRequest);



static UserService newInstance(String userAPIKey) {
    String credentials = userAPIKey + ":";

    final String basic = "Basic "+ Base64.encodeBase64(credentials.getBytes());

    httpClient.addInterceptor(new Interceptor() {
        @Override
        public Response intercept(Interceptor.Chain chain) throws IOException {
            Request original = chain.request();

            Request.Builder requestBuilder = original.newBuilder()
                    .header("Authorization", basic);
            requestBuilder.header("Accept", "application/json");
            requestBuilder.method(original.method(),original.body());


            Request request = requestBuilder.build();
            return chain.proceed(request);
        }
    });

OkHttpClient client = httpClient.build();
Retrofit retrofit = builder.client(client).build();

return retrofit.create(BlueshiftUserService.class);
}

当我在 UserService 上调用 updateUser 时

Response<UserAPIResponse> response = UserService.userUpdate(userUpdateRequest).execute();

response.code 为 401(未经授权/身份验证失败)

带有 -u 和相同凭据的curl 命令按预期工作。

最佳答案

问题出在凭据编码上。我没有将其作为字符串发送。

byte[] encodedAuth= Base64.encodeBase64(credentials.getBytes());
final String basic = "Basic " + new String(encodedAuth);

关于retrofit - 带改造的基本身份验证,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37830236/

相关文章:

java - Tomcat 是否能够在一个应用程序(BASIC 和 CLIENT-CERT)上使用混合身份验证?

ios - iOS 8 和 iOS 9 上 NSURLSession 的区别?

php - 分离 Piwik 的后端和跟踪 URL

android - 为什么 RxJava 经常与 Retrofit 一起使用?

java - Android 使用 Retrofit 和 OkHttp 获取 Endpoints

android - 如何使用改造将成功的响应主体转换为特定类型?

wcf - 未调用自定义 UserNamePasswordValidator

java - 如何使用自定义转换器?

java - 使用Retrofit从单个键中提取不同的数据

node.js - 使用 express 提供静态文件时无法使用基本身份验证