Порт в Домене отклоняет cookie - PullRequest
0 голосов
/ 03 декабря 2018

Я подключаюсь к RESTful API, который имеет ресурс входа в систему: / login.Используя учетные данные, которые они дали мне, это приводит к хорошему 200.Но попытка получить доступ к защищенным ресурсам впоследствии дает мне 401 (хотя работает с аддоном Firefox RESTClient).После отладки я обнаружил, что некоторые файлы cookie отклоняются, и я полагаю, что они не позволяют мне войти.

Предупреждающее сообщение на них:

Файл cookie отклонен [somename = "somevalue ", версия: 0, домен: xyz.org: 443 , путь: /, expiry: null] Недопустимый атрибут 'domain'" xyz: 443 ".Домен происхождения: "xyz"

Я использую Apache HTTP Client httpcomponents-client-4.5.6 для подключения к сайту.Что я могу сделать?Насколько я вижу, единственное, что беспокоит, это: 443.API доступен только через https.Я не узнал, смогу ли я изменить свой доступ к сайту с помощью httpclient, поэтому он больше не видит различий в доменных именах.

Я много искал и нашел много устаревших решений, касающихся CookieSpecProviders иустановив CookieSpecs в «easy» - но все это, казалось, полностью исключило все куки.Мой отладочный вывод из хранилища cookie всегда был пустым после использования этих решений (но предупреждающие сообщения исчезли).

Я создал быстрый и грязный изолированный пример:

package apitest;

import java.io.IOException;

import org.apache.http.HttpHost;
import org.apache.http.client.CookieStore;
import org.apache.http.client.methods.CloseableHttpResponse;
import org.apache.http.client.methods.HttpGet;
import org.apache.http.client.protocol.HttpClientContext;
import org.apache.http.cookie.Cookie;
import org.apache.http.impl.client.BasicCookieStore;
import org.apache.http.impl.client.CloseableHttpClient;
import org.apache.http.impl.client.HttpClientBuilder;

public class ApiTest {
    public static void main(String[] args) {
        HttpHost target = new HttpHost("stackoverflow.com", 443, "https");
        HttpClientContext context = HttpClientContext.create();
        CookieStore cookieStore = new BasicCookieStore();

        HttpClientBuilder clientBuilder = HttpClientBuilder.create().setDefaultCookieStore(cookieStore);
        CloseableHttpClient httpClient = clientBuilder.build();

        HttpGet stackGet = new HttpGet("");
        CloseableHttpResponse response;

        try {
            response = httpClient.execute(target, stackGet, context);

            printCookies(cookieStore);
        } catch (IOException e) {
            e.printStackTrace();
        }

        stackGet = new HttpGet("/tags");
        try {
            response = httpClient.execute(target, stackGet, context);

            printCookies(cookieStore);
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

    static void printCookies(CookieStore cookieStore) {
        for (Cookie c : cookieStore.getCookies()) {
            System.out.println(c.getName() + " : " + c.getValue());
        }
    }
}

Тамвыполняются два последовательных запроса GET, которые приводят к правильному поведению.Файл cookie 'prov', который должен быть своего рода файлом cookie сеанса, остается неизменным.То же самое, что было сделано с вышеупомянутым API, дает ошибку.

1 Ответ

0 голосов
/ 04 декабря 2018

Я не знаю, нужно ли это делать, но для решения этой проблемы я создал новый CookieSpec, как рекомендовано для разных источников:

EasySpecProvider.class

import org.apache.http.cookie.CookieSpec;
import org.apache.http.cookie.CookieSpecProvider;
import org.apache.http.protocol.HttpContext;

class EasySpecProvider implements CookieSpecProvider {
    @Override
    public CookieSpec create(HttpContext context) {
        return new EasyCookieSpec();
    }
}

EasyCookieSpec.class

import org.apache.http.cookie.Cookie;
import org.apache.http.cookie.CookieOrigin;
import org.apache.http.cookie.MalformedCookieException;
import org.apache.http.impl.cookie.DefaultCookieSpec;

class EasyCookieSpec extends DefaultCookieSpec {
    @Override
    public void validate(Cookie arg0, CookieOrigin arg1) throws MalformedCookieException {
    }
}

Я зарегистрировал его через

Registry<CookieSpecProvider> r = RegistryBuilder.<CookieSpecProvider>create()
        .register("easy", new EasySpecProvider()).build();

и

clientBuilder.setDefaultCookieSpecRegistry(r)
.setDefaultRequestConfig(RequestConfig.custom().setCookieSpec("easy").build())

в клиентестроитель.После этого все искаженные куки были приняты, но сессионные куки менялись с каждым запросом.Я полагаю, что то же самое произошло и на сервере API (несовпадение доменной части файла cookie).Теперь я очищаю хранилище cookie при каждом запросе и вручную воссоздаю cookie сеанса с правильным атрибутом домена, и теперь он работает.

...