Базовая аутентификация для JAVA-приложения с использованием OkHttp

#java #okhttp

#java #okhttp

Вопрос:

Сначала я хотел аутентифицировать свое java-приложение с помощью OkHttp, а затем после аутентификации ответ возвращает идентификатор сеанса (ключ), который я хотел использовать в последующих вызовах API. ниже приведен код, который я использую для достижения этой цели.

     String url = "my application url";
    String username = "xxx";  
    String password = "zzz";  
    String userpass = username   ":"   password;  
    String basicAuth = "Basic :"   new String(Base64.getEncoder().encode(userpass.getBytes()));  
   
    OkHttpClient client = new OkHttpClient();
    Response response ;
    Request request = new Request.Builder()
                     .url(url)
                     .addHeader("Authorization", basicAuth)
                     .build();
    response = client.newCall(request).execute();
    
    if (!response.isSuccessful()) throw new IOException("Unexpected code "   response);

     System.out.println(response.body().string());
  

но он выдает ошибку, в которой говорится
{«ResponseStatus»: «СБОЙ», «ResponseMessage»: «Метод запроса ‘GET’ не поддерживается», «errorCodes»: null, «ошибки»:[{«type»:»METHOD_NOT_SUPPORTED», «message»:»Метод запроса ‘GET’ не поддерживается»}],»Тип ошибки»:»ОБЩИЕ»}

может кто-нибудь, пожалуйста, помочь мне решить эту проблему. или, если у кого-либо есть какая-либо другая идея для аутентификации java-приложения с использованием okhttp, пожалуйста, предложите…

Комментарии:

1. Заголовок basic auth неверен, должен быть "Basic: " ... , но это на самом деле не объясняет сообщение об ошибке.

Ответ №1:

Вы должны использовать вспомогательные классы, чтобы избежать большей части логики для имени пользователя и пароля.

https://github.com/square/okhttp/blob/master/samples/guide/src/main/java/okhttp3/recipes/Authenticate.java

             String credential = Credentials.basic("jesse", "password1");
            return response.request().newBuilder()
                .header("Authorization", credential)
                .build();
  

Предполагая, что этот API является POST, а не GET, также следуйте

https://github.com/square/okhttp/blob/master/samples/guide/src/main/java/okhttp3/recipes/PostString.java

     Request request = new Request.Builder()
        .url("https://api.github.com/markdown/raw")
        .post(RequestBody.create(postBody, MEDIA_TYPE_MARKDOWN))
        .build();
  

Ответ №2:

У вас уже все было в порядке. Требуется лишь небольшое исправление:

 String basicAuth = "Basic "   new String(Base64.getEncoder().encode(userpass.getBytes()));
  

т.е. вам просто нужно удалить лишнее ‘:’, поскольку об этом уже позаботились .addHeader("Authorization", basicAuth) частично.