2015-08-13 3 views
2

В настоящее время я пытаюсь настроить сервер веб-сокетов на сервере приложений SAP в качестве доказательства концепции. Приложение, которое подключается к серверу веб-сокетов, не будет UI5 или WebDynpro, а просто программой среднего уровня, запущенной на безголовом компьютере.ABAP Websocket Server XSRF Token

После краткого руководства, я установка нажимного канала и у меня есть объект с методами интерфейса ON_START, ON_MESSAGE и т.д. Я в настоящее время тестирования интерфейса с помощью wscat, который вы можете получить от npm.

Когда я попытался подключиться к моей службе в первый раз, используя wscat, я получал ошибку HTTP 500.

enter image description here

Я не был уверен, почему я получаю ошибку 500, поэтому я попытался получить доступ к URL, чтобы увидеть, что происходит с помощью HTTP и веб-браузер.

500 SAP Internal Server Error 

ERROR: Cross-Site Request Forgery (XSRF) check has failed ! (termination: ABORT_MESSAGE_STATE) 

Я видел эти маркеры также используются службами шлюза, поэтому я создал быструю службу шлюза и послал GET запрос с X-CSRF-Token: Fetch кроме маркера, который я получаю от этого не работает, когда я пытаюсь используйте параметр uri sap-XSRF.

Идти вперед, я начал отлаживать CL_APC_MANAGER функцию HANDLE_REQUEST, чтобы узнать, приходит ли мой запрос вообще. Я также хотел проследить, откуда исходит ошибка 500. Мне удалось проследить его до CL_APC_MANAGER метод CHECK_XSRF.

METHOD check_xsrf. 
    DATA: lv_xsrf_token    TYPE string. 
    * 
    * validate XSRF token 
    * 
    lv_xsrf_token = i_server->request->get_form_field(name = if_http_form_fields_sap=>sap_xsrf). 
IF lv_xsrf_token IS INITIAL. 
    lv_xsrf_token = i_server->request->get_header_field(name = if_http_form_fields_sap=>sap_xsrf). 
ENDIF. 

IF lv_xsrf_token IS INITIAL. 
    r_successful = abap_false. 
ELSE. 

    CALL METHOD i_server->validate_xsrf_token 
    EXPORTING 
     token     = lv_xsrf_token 
    IMPORTING 
     successful    = r_successful 
    EXCEPTIONS 
     token_not_found   = 1 
     cookie_not_found   = 2 
     internal_error   = 3 
     called_by_public_service = 4 
     OTHERS     = 5. 
    IF sy-subrc <> 0 OR abap_false = r_successful. 
    r_successful = abap_false. 
    ELSE. 
    r_successful = abap_true. 
    ENDIF. 
ENDIF. 

ENDMETHOD. 

Если я пропустить эту проверку вручную с помощью отладчика, чем я могу подключиться к веб-сокетов сервера без проблем.

enter image description here

Однако я не уверен, что вообще, как я на самом деле должен получить этот маркер, прежде чем пытаться подключиться. Я заметил, что XSRF Tokens сохранены в таблице базы данных SECURITY_CONTEXT. Единственная проблема заключается в том, что в этой таблице создается запись с ключом, который должен иметь после попытки подключения. Мне нужно это до, и я не уверен, что процедура для получения маркера должным образом.

Есть ли у кого-нибудь предыдущий опыт использования этих функций, которые могут пролить свет? Заранее спасибо.

EDIT Я использую версию 740 с пакетом обновления 4.

+0

Чтобы включить, я оказался немного нетерпелив в своем поиске и закончил писать обработчик, который возвращает маркер и вводит его в запрос, а затем вызывает стандартную реализацию SAP: https: //gist.github.com/anonymous/7c784568f69239ef722f Однако это не настоящее решение, это просто взломать. –

+0

Вы сохранили белый цвет кросс-кантри (транзакция «SAPC_CROSS_ORIGIN')? – mjturner

+0

Я просто попробовал, у меня, похоже, нет такой сделки. –

ответ

1

«правильный» способ сделать иметь заголовок сгенерированный правильно это путем сохранения таблицы APC_CROSS_ORIGIN (транзакция SAPC_CROSS_ORIGIN).

Функциональность WebSockets была выпущена только для использования пользователями в 7.40SP5, что, вероятно, объясняет, почему у вас нет этой таблицы в вашей системе. Я бы рекомендовал использовать обходное решение, пока ваша система не будет исправлена.

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