У меня возникла проблема с подключением Android к службе REST с базовой аутентификацией jwt. Я использую OkHttp 3 и Retrofit 2 для своего кода на Android. Сервер - это сервер node.js Hapi, работающий на эластичном материале AWS с настройкой прокси-сервера nginx по умолчанию. Все бэкэнд выполняет проверку токена аутентификации для каждого вызова.OkHttp с базовой аутентификацией токена работает для GET, но не для DELETE
Задача: Оба моих GET и DELETE требуют заголовка «Авторизация» с токеном. Когда я вызываю GET с токеном, он работает. Когда я делаю DELETE с токеном, я получаю 403 ACCESS DENIED, но только когда устройство Android подключено к сотовой сети и имеет адрес ipv6. Когда он подключен к домашнему Wi-fi, он работает нормально.
Для получения дополнительной информации, подключение непосредственно к серверу nodejs на порту 8080 также заставляет все работать нормально. Я хотел бы сохранить nginx на картинке, если я хочу запустить несколько копий узла сервера в том же поле. Кроме того, я очень новичок в этом и рад рассмотреть любые альтернативы.
Вот Android код:
Gson gson = new GsonBuilder().create();
OkHttpClient okClient = new OkHttpClient.Builder()
.readTimeout(40, TimeUnit.SECONDS)
.writeTimeout(40, TimeUnit.SECONDS)
.addInterceptor(
new Interceptor() {
@Override
public okhttp3.Response intercept(Chain chain) throws IOException {
Request original = chain.request();
//auth token for every request
Request.Builder requestBuilder = original.newBuilder()
.addHeader("Authorization", authToken);
Request request = requestBuilder.build();
// it correctly prints out header with the token for both GET and DELETE
Log.d("ApiManager", "HEADERS: " + request.headers().toString());
okhttp3.Response response = chain.proceed(request);
return response;
}
}).build();
Retrofit retrofit = new Retrofit.Builder()
.client(okClient)
.baseUrl(MyApi.baseUrl)
.addConverterFactory(GsonConverterFactory.create(gson))
.build();
myApi = retrofit.create(MyApi.class);
И моя установка Nginx:
upstream nodejs {
server 127.0.0.1:8081;
keepalive 256;
}
server {
listen 8080;
if ($time_iso8601 ~ "^(\d{4})-(\d{2})-(\d{2})T(\d{2})") {
set $year $1;
set $month $2;
set $day $3;
set $hour $4;
}
access_log /var/log/nginx/healthd/application.log.$year-$month-$day-$hour healthd;
access_log /var/log/nginx/access.log main;
location/{
proxy_pass http://nodejs;
proxy_set_header Connection "";
proxy_http_version 1.1;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
}
gzip on;
gzip_comp_level 4;
gzip_types text/html text/plain text/css application/json application/x-javascript text/xml application/xml application/xml+rss text/javascript;
}
UPDATE: Это похоже на работу, если я подключить Android устройство к сети Wi-Fi, но не работает, если я подключен к своей сотовой сети. Я застрял. Из журналов доступа nginx на сервере. Он не регистрирует 403 ошибку:
- Android устройство подключено к сети сотовой связи: IP: "2001: 56a: 6ffc: d07e: 0: 47: 2e8a: 4101, 142.59.70.25" GET и POST запросов работа, но DELETE нет.
- Android-устройство подключено к Wi-Fi: IP: «96.51.151.36», GET, POST и DELETE.
Не знаете, что не так с вашим текущим кодом, но я обычно использую аннотацию '@ Headers' в моем интерфейсе Retrofit для определения заголовков. Дополнительную информацию см. В [их документах] (https://futurestud.io/tutorials/retrofit-add-custom-request-header). – Joris
Возможно, ваша сеть сотовой сети блокирует запросы PUT и DELETE. Если это так, использование https скроет заголовки из брандмауэров и ваши запросы пройдут. –
[RESTful PUT и DELETE и брандмауэры] (http://stackoverflow.com/questions/1828790/restful-put-and-delete-and-firewalls) –