2016-11-28 2 views
0

У меня возникла проблема с подключением 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 ошибку:

  1. Android устройство подключено к сети сотовой связи: IP: "2001: 56a: 6ffc: d07e: 0: 47: 2e8a: 4101, 142.59.70.25" GET и POST запросов работа, но DELETE нет.
  2. Android-устройство подключено к Wi-Fi: IP: «96.51.151.36», GET, POST и DELETE.
+0

Не знаете, что не так с вашим текущим кодом, но я обычно использую аннотацию '@ Headers' в моем интерфейсе Retrofit для определения заголовков. Дополнительную информацию см. В [их документах] (https://futurestud.io/tutorials/retrofit-add-custom-request-header). – Joris

+0

Возможно, ваша сеть сотовой сети блокирует запросы PUT и DELETE. Если это так, использование https скроет заголовки из брандмауэров и ваши запросы пройдут. –

+0

[RESTful PUT и DELETE и брандмауэры] (http://stackoverflow.com/questions/1828790/restful-put-and-delete-and-firewalls) –

ответ

1

Если POST работает и DELETE делает то не попробовать использовать метод HTTP переопределение либо с X-HTTP-Method-Override заголовка или параметра запроса _method и посмотреть, если он работает таким образом.

Если он начинает работать, вы узнаете, что это проблема на уровне HTTP (например, проблема с некоторым прокси-сервером). Если это не так, вы узнаете, что это проблема с обработчиками маршрутов.

См. Common non-standard request fields в Википедии. Независимо от того, хотите ли вы использовать его в долгосрочной перспективе, это еще один вопрос, но это позволит вам быстро сократить проблему.

Вы не разместили какой-либо код, и вы даже не сказали, какая инфраструктура используется на бэкэнд, поэтому нет конкретного ответа на вопрос о том, как это сделать. Если вы используете Express, вы можете использовать промежуточное программное обеспечение method-override.

Также в одном из других вопросов, которые вы опубликовали по той же проблеме, вы указали свою конфигурацию nginx, и, похоже, что вы делаете это, в основном, проксируя трафик с порта 8080 до 8081 по какой-то причине. Попробуйте напрямую подключиться к 8081, чтобы исключить возможность того, что это ваш собственный прокси-сервер, который вызывает проблему.

(Кстати, было бы проще, если бы вы разместили всю соответствующую информацию в одном вопросе вместо того, чтобы рассеивать ее между 3 или 4 подобными вопросами о той же проблеме.Вопросы можно редактировать, чтобы добавить дополнительную информацию после их публикации. См.: How do edits work для получения дополнительной информации.)

+0

Спасибо за ответ, я удалил все повторяющиеся вопросы. Настройка прокси-сервера 8080 - 8081 - это стандартная конфигурация шины AWS с эластичным бобовым стержнем для nginx. Я попытался подключиться непосредственно к 8080, и проблема исчезла. В журналах доступа nginx адрес ipv6 больше не регистрируется для устройства в мобильной сети (вместо «-»). – Vlad

Смежные вопросы