Nano Hash - криптовалюты, майнинг, программирование

Базовая аутентификация с модификацией

Я пытаюсь создать клиент для REST API с помощью Retrofit. API использует базовую аутентификацию, и мне не удалось пройти аутентификацию с помощью Retrofit.

Я протестировал 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);
}

Когда я вызываю updateUser в UserService

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

Код ответа 401 (неавторизованный/аутентификация не удалась)

Команда curl с параметром -u и теми же учетными данными работает, как и ожидалось.


Ответы:


1

Проблема была с кодировкой учетных данных. Я не отправлял это как строку.

byte[] encodedAuth= Base64.encodeBase64(credentials.getBytes());
final String basic = "Basic " + new String(encodedAuth);
15.06.2016
  • Кстати, OkHttp предоставляет для этого утилиты, например. Credentials.basic("jesse", "password1"). 15.06.2016

  • 2

    использовать эти библиотеки в файле Gradle

    compile 'com.squareup.retrofit:retrofit:1.9.0'
    compile 'com.squareup.okhttp:okhttp:2.3.0'
    compile 'com.cookpad.android.rxt4a:rxt4a:0.9.0'
    compile 'io.reactivex:rxjava:1.0.12'
    

    и поместите эти классы в свой проект

     public class ServiceGenerator { 
      private static final String TAG = erviceGenerator.class.getSimpleName();
      public static final int READ_TIMEOUT = 10000;
      public static final int CONNECT_TIMEOUT = 100000;   
         // No need to instantiate this class. 
      private ServiceGenerator(){}   
         public static <S> S createService(Class<S> serviceClass, String
       endpoint) {
           // Call basic auth generator method without user and pass
           return createService(serviceClass, endpoint, null, null);   }
    
         public static <S> S createService(Class<S> serviceClass, String
       endpoint, String username, String password) {
           OkHttpClient okHttpClient = new OkHttpClient();
           okHttpClient.setReadTimeout(READ_TIMEOUT, TimeUnit.SECONDS);
           okHttpClient.setConnectTimeout(CONNECT_TIMEOUT, TimeUnit.SECONDS);
    
           // Set endpoint url and use OkHTTP as HTTP client
           RestAdapter.Builder builder = new RestAdapter.Builder()
               .setEndpoint(endpoint)
               .setConverter(new GsonConverter(new Gson()))
               .setClient(new OkClient(okHttpClient));
    
           if (username != null && password != null) {
             // Concatenate username and password with colon for authentication
             final String credentials = username + ":" + password;
    
             builder.setRequestInterceptor(new RequestInterceptor() {
               @Override
               public void intercept(RequestFacade request) {
                 // Create Base64 encoded string
                 String string = "Basic " + Base64.encodeToString(credentials.getBytes(), Base64.NO_WRAP);
                 request.addHeader("Authorization", string);
                 request.addHeader("Accept", "application/json");
               }
             });
           }
    
           RestAdapter adapter = builder.build();
    
           return adapter.create(serviceClass);   } }
    

    и этот интерфейс

    public class TodolyClient {
    
      private static final String TAG = TodolyClient.class.getSimpleName();
    
      public static final String ENDPOINT = "your base URL";
    
      public interface TodolyService {
    
        @GET("/wp-json/wc/v2/products")(your remaining url)
        Observable<Object> isAuthenticated();
    
    
      }
    }
    

    и вызовите приведенный ниже метод в своей основной деятельности

    private void createProject() {
     final TodolyClient.TodolyService service =ServiceGenerator.createService(
                    TodolyClient.TodolyService.class, TodolyClient.ENDPOINT, "your user name",
                    "your password");
    
            Observable<Object> observable = service.isAuthenticated();
             AndroidCompositeSubscription compositeSubscription = new AndroidCompositeSubscription();
            observable
                    .lift(new OperatorAddToCompositeSubscription<Object>(compositeSubscription))
                    .subscribeOn(Schedulers.io())
                    .observeOn(AndroidSchedulers.mainThread())
                    .subscribe(new Observer<Object>() {
    
                        @Override
                        public void onNext(Object project) {
                            android.util.Log.d(TAG, "onNext: "+project.toString());
                        }
    
                        @Override
                        public void onCompleted() {
                            android.util.Log.d(TAG, "onNext:commm " );
                        }
    
                        @Override
                        public void onError(Throwable e) {
                            android.util.Log.d(TAG, "onNext: eeeeeeeee"+e.getMessage());
    
                        }
                    });
        }
    
    29.05.2017

    3

    На данный момент это самый простой метод, который я когда-либо пробовал для «Базовой аутентификации».

    Используйте приведенный ниже код для создания заголовка аутентификации (класс API/Repository). Здесь вы можете добавить любой набор символов для кодирования в качестве третьего параметра.

     var basic = Credentials.basic("YOUR_USERNAME", "YOUR_PASSWORD")
    

    Передайте это как заголовок вызову веб-сервиса (класс API/Repository)

     var retrofitCall = myWebservice.getNewsFeed(basic)
    

    Добавьте базовый заголовок в качестве параметра (класс интерфейса Retrofit Webservice).

     @GET("newsfeed/daily")
     fun getNewsFeed(@Header("Authorization") h1:String):Call<NewsFeedResponse>
    

    Извините, мой код на Kotlin, но его легко перевести на Java.

    Ссылки: https://mobikul.com/basic-authentication-retrofit-android/

    09.10.2018
    Новые материалы

    Кластеризация: более глубокий взгляд
    Кластеризация — это метод обучения без учителя, в котором мы пытаемся найти группы в наборе данных на основе некоторых известных или неизвестных свойств, которые могут существовать. Независимо от..

    Как написать эффективное резюме
    Предложения по дизайну и макету, чтобы представить себя профессионально Вам не позвонили на собеседование после того, как вы несколько раз подали заявку на работу своей мечты? У вас может..

    Частный метод Python: улучшение инкапсуляции и безопасности
    Введение Python — универсальный и мощный язык программирования, известный своей простотой и удобством использования. Одной из ключевых особенностей, отличающих Python от других языков, является..

    Как я автоматизирую тестирование с помощью Jest
    Шутка для победы, когда дело касается автоматизации тестирования Одной очень важной частью разработки программного обеспечения является автоматизация тестирования, поскольку она создает..

    Работа с векторными символическими архитектурами, часть 4 (искусственный интеллект)
    Hyperseed: неконтролируемое обучение с векторными символическими архитектурами (arXiv) Автор: Евгений Осипов , Сачин Кахавала , Диланта Хапутантри , Тимал Кемпития , Дасвин Де Сильва ,..

    Понимание расстояния Вассерштейна: мощная метрика в машинном обучении
    В обширной области машинного обучения часто возникает необходимость сравнивать и измерять различия между распределениями вероятностей. Традиционные метрики расстояния, такие как евклидово..

    Обеспечение масштабируемости LLM: облачный анализ с помощью AWS Fargate и Copilot
    В динамичной области искусственного интеллекта все большее распространение получают модели больших языков (LLM). Они жизненно важны для различных приложений, таких как интеллектуальные..