Не удалось проанализировать полезную нагрузку: полезная нагрузка [0] = <(Android RequestFactory не аутентифицирован) - PullRequest
3 голосов
/ 14 марта 2012

Я разрабатываю приложение с GAE и Android, используя RPC.Но когда я пытаюсь отправить RPCall с Android на сервер, я получаю следующую ошибку:

03-14 12:00:57.445: E/AndroidRuntime(30718): FATAL EXCEPTION: IntentService[domiii.1992@gmail.com]
03-14 12:00:57.445: E/AndroidRuntime(30718): java.lang.RuntimeException: Could not parse payload: payload[0] = <
03-14 12:00:57.445: E/AndroidRuntime(30718):    at com.google.web.bindery.autobean.vm.impl.JsonSplittable.create(JsonSplittable.java:70)
03-14 12:00:57.445: E/AndroidRuntime(30718):    at com.google.web.bindery.autobean.shared.impl.StringQuoter.split(StringQuoter.java:73)
03-14 12:00:57.445: E/AndroidRuntime(30718):    at com.google.web.bindery.autobean.shared.AutoBeanCodex.decode(AutoBeanCodex.java:54)
03-14 12:00:57.445: E/AndroidRuntime(30718):    at com.google.web.bindery.requestfactory.shared.impl.AbstractRequestContext$StandardPayloadDialect.processPayload(AbstractRequestContext.java:323)
03-14 12:00:57.445: E/AndroidRuntime(30718):    at com.google.web.bindery.requestfactory.shared.impl.AbstractRequestContext$5.onTransportSuccess(AbstractRequestContext.java:1108)
03-14 12:00:57.445: E/AndroidRuntime(30718):    at com.cloudsmsplus.util.AndroidRequestTransport.send(AndroidRequestTransport.java:68)
03-14 12:00:57.445: E/AndroidRuntime(30718):    at com.google.web.bindery.requestfactory.shared.impl.AbstractRequestContext.doFire(AbstractRequestContext.java:1102)
03-14 12:00:57.445: E/AndroidRuntime(30718):    at com.google.web.bindery.requestfactory.shared.impl.AbstractRequestContext.fire(AbstractRequestContext.java:569)
03-14 12:00:57.445: E/AndroidRuntime(30718):    at com.google.web.bindery.requestfactory.shared.impl.AbstractRequest.fire(AbstractRequest.java:54)
03-14 12:00:57.445: E/AndroidRuntime(30718):    at com.google.web.bindery.requestfactory.shared.impl.AbstractRequest.fire(AbstractRequest.java:59)
03-14 12:00:57.445: E/AndroidRuntime(30718):    at com.cloudsmsplus.c2dm.DeviceRegistrar.registerOrUnregister(DeviceRegistrar.java:70)
03-14 12:00:57.445: E/AndroidRuntime(30718):    at com.cloudsmsplus.C2DMReceiver.onRegistered(C2DMReceiver.java:51)
03-14 12:00:57.445: E/AndroidRuntime(30718):    at com.google.android.c2dm.C2DMBaseReceiver.handleRegistration(C2DMBaseReceiver.java:191)
03-14 12:00:57.445: E/AndroidRuntime(30718):    at com.google.android.c2dm.C2DMBaseReceiver.onHandleIntent(C2DMBaseReceiver.java:110)
03-14 12:00:57.445: E/AndroidRuntime(30718):    at android.app.IntentService$ServiceHandler.handleMessage(IntentService.java:65)
03-14 12:00:57.445: E/AndroidRuntime(30718):    at android.os.Handler.dispatchMessage(Handler.java:99)
03-14 12:00:57.445: E/AndroidRuntime(30718):    at android.os.Looper.loop(Looper.java:137)
03-14 12:00:57.445: E/AndroidRuntime(30718):    at android.os.HandlerThread.run(HandlerThread.java:60)

Для доступа к моему приложению пользователь должен пройти аутентификацию, поэтому я устанавливаю ограничение безопасности на * для каждого URL,Несмотря на то, что я генерирую куки, я получаю эту ошибку.Я думаю, что ответ, который я получаю, это страница входа в систему.

В моем случае я отправляю RPCall, чтобы зарегистрировать устройство для C2DM.И большая часть кода, который я использую, была сгенерирована с помощью проекта Android, связанного с Appengine.Кто-то уже нашел обходной путь или исправление для этого.

PS: я использую GAE 1.6.3, Android API v8, GWT 2.4.0 (но я думаю, что это не имеет значения)

Редактировать:

Хорошо, я нашел что-то новое.Если вы отправляете что-то из Android в App Engine с помощью RPC, клиент фактически не аутентифицируется.Вы просто получаете токен, затем файл cookie, а затем (как мне кажется) RequestFactory включает этот файл cookie как дополнительное поле данных.Поэтому мой web.xml в App Engine выглядел так:

<!-- Require user login for every access -->
<security-constraint>
    <web-resource-collection>
        <url-pattern>/*</url-pattern>
    </web-resource-collection>
    <auth-constraint>
        <role-name>*</role-name>
    </auth-constraint>
</security-constraint>

Для доступа к моему приложению пользователь должен пройти аутентификацию независимо от того, какой URL он запрашивает.Так как RequestFactory не аутентифицирован, ответ сервера с html-страницей входа в систему и клиентом Android выдает ошибку «Не удалось проанализировать полезную нагрузку».Странно то, что вы можете отправлять аутентифицированные RPC со стороны GWT, и я не понимаю, почему разработчики этого API сделали это так, что сторона GWT может отправлять эти аутентифицированные вызовы, а сторона Android - нет.в состоянии отправить их.

Что я сделал сейчас, так это то, что я исключил сервлет gwtRequest из своего ограничения безопасности с помощью этих дополнительных строк в web.xml

<security-constraint>
        <web-resource-collection>
            <url-pattern>/gwtRequest</url-pattern>
        </web-resource-collection>
    </security-constraint>

Я также заметил, что если вы создаете новый движок приложенийподключенный проект Android, в котором web.xml просто устанавливает необходимую аутентификацию для ProjectName.html.

...