Проблема при доступе к WooCommerce Rest API из приложения на основе OkHttp - PullRequest
0 голосов
/ 16 сентября 2018

Я хочу создать клиент для Android, который может взаимодействовать с сайтом на основе WooCommerce с помощью Rest Api, предоставленного WooCommerce

Это мой код для Android.Я использую библиотеку OkHttp для работы в сети.

public class MainActivity extends AppCompatActivity {
    OkHttpClient client;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        String cred = Credentials.basic("ck_...","cs_...");

        OkHttpClient client = new OkHttpClient
                                    .Builder()
                                    .build();
        Request req = new Request
                            .Builder()
                .addHeader("Authorization",cred)

                .url("http://10.0.2.2:8080/woocom/wp-json/wc/v2/products")
                            .build();
        client.newCall(req).enqueue(new Callback() {
            @Override
            public void onFailure(Call call, IOException e) {
                Log.d("api resp", "onFailure: ");
                e.printStackTrace();
            }

            @Override
            public void onResponse(Call call, Response response) throws IOException {
                Log.d("Api resp", "onResponse: "+response.body().string());
            }
        });
    }
}

Это журнал ошибок после запуска приложения

com.example.android.woocommerceapiintegration D/Api resp: onResponse: {"code":"woocommerce_rest_cannot_view","message":"Sorry, you cannot list resources.","data":{"status":401}}

Что я здесь не так делаю.Я опробовал клиент NodeJS, предоставленный WooCommerce, который работает нормально.

Также я не могу получить доступ к остальным API через curl в соответствии с командой, приведенной в документах

Может кто-тоскажите, что я делаю не так?

Обновление : Выбранный ответ - это то, что необходимо сделать в производственных средах, и это технически правильная вещь.Если вы хотите избежать проблем с OAuth на сервере разработки, я ответил на него отдельно.

Ответы [ 2 ]

0 голосов
/ 01 октября 2018

Спасибо Аксели за ответ на мой вопрос. Я также наградил вас за вознаграждение и спасибо за пополнение моих знаний. Несмотря ни на что, я нашел простое решение этой проблемы.

Меня беспокоило то, что при разработке у нас, как правило, нет сервера на базе https, и, следовательно, нам приходится проходить через этот утомительный процесс на основе OAuth, который в любом случае не будет производственным, так как сервер, который мы, вероятно, будем использовать, будет https включен.

Итак, чтобы использовать обычную аутентификацию на сервере http dev, вам нужно перейти на [your wordpress directory]/wp-content/woocommerce/includes/api. Узнайте class-wc-rest-authentication.php. Этот класс обрабатывает аутентификацию API. Найдите функцию аутентификации, которая выглядит следующим образом

public function authenticate( $user_id ) {
    // Do not authenticate twice and check if is a request to our endpoint in the WP REST API.
    if ( ! empty( $user_id ) || ! $this->is_request_to_rest_api() ) {
        return $user_id;
    }

    if ( is_ssl() ) {
        return $this->perform_basic_authentication();
    }

    return $this->perform_oauth_authentication();
}

закомментируйте условие is_ssl и просто верните $ this-> execute_basic_authentication (), чтобы в любом случае была выполнена базовая аутентификация.

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

0 голосов
/ 19 сентября 2018

Код 401 указывает на проблему с авторизацией вашего соединения.В частности, ваша проблема вызвана тем, что вы используете BasicAuth с HTTP-соединением.

Документация WooCommerce REST API указывает, что BasicAuth поддерживается только для HTTPS-соединений, а HTTP-соединения должны использовать OAuth 1.0a«одноногая» аутентификация, чтобы «гарантировать», что ваши учетные данные не перехвачены злоумышленником.Важно отметить, что даже с OAuth 1.0a HTTP-соединение никогда не будет по-настоящему безопасным, и настоятельно рекомендуется переключить ваше приложение на безопасное HTTPS-соединение.

Между тем, чтобы ваш код работал,вам придется реализовать метод аутентификации OAuth 1.0a для вашего приложения Android.

Здесь вы можете найти полный набор инструкций и полный пример проекта реализации OAuth 1.0a для Android . Страница GitHub содержит превосходное руководство с пошаговыми инструкциями по использованию библиотеки, указанной выше.Просто убедитесь, что при использовании предоставленного кода вы должны учитывать тот факт, что вы используете OKHttp.К счастью, автор очень хорошо прокомментировал код в инструкциях и запомнил изменения, которые нужно внести при использовании чего-то вроде OkHttp.

Вы можете использовать Retrofit и просто написать Interceptor, который принимаетЗабота о «мимолетной» части, как описано в документации здесь.

Вы также можете следовать пошаговому руководству, описанному в Документации WooCommerce здесь досгенерируйте свою подпись OAuth и, наконец, encodedUrl, а затем передайте ее своему http-клиенту.Этот процесс включает в себя: (см. Документацию для получения подробных спецификаций для каждого раздела)

  1. Сбор метода запроса и URL-адреса
  2. Сбор всех параметров oauth_* и кодирование их в одну строку с использованиемпроцентное кодирование и правильный порядок.Например (взято из WooCommerce Docs): oauth_consumer_key=abc123&oauth_signature_method=HMAC-SHA1
  3. Создайте базовую строку для подписи, соединив значения 1 и 2. Например: (еще раз из Docs):

GET&http%3A%2F%2Fwww.example.com%2Fwp-json%2Fwc%2Fv2%2Forders&oauth_consumer_key%3Dabc123%26oauth_signature_method%3DHMAC-SHA1

Наконец, сгенерируйте подпись, используя HMAC-SHA1 (также поддерживается HMAC-SHA256).

Лично я бы порекомендовал первый или второй подход.«Не нужно изобретать велосипед».

РЕДАКТИРОВАТЬ: Вы можете посмотреть этот вопрос , в котором обсуждается, как вы можете использовать самозаверяющие сертификаты в локальной среде разработчикас OkHttp.

...