В настоящее время я пытаюсь настроить сервер веб-сокетов на сервере приложений SAP в качестве доказательства концепции. Приложение, которое подключается к серверу веб-сокетов, не будет UI5 или WebDynpro, а просто программой среднего уровня, запущенной на безголовом компьютере.ABAP Websocket Server XSRF Token
После краткого руководства, я установка нажимного канала и у меня есть объект с методами интерфейса ON_START
, ON_MESSAGE
и т.д. Я в настоящее время тестирования интерфейса с помощью wscat
, который вы можете получить от npm
.
Когда я попытался подключиться к моей службе в первый раз, используя wscat
, я получал ошибку HTTP 500.
Я не был уверен, почему я получаю ошибку 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.
Если я пропустить эту проверку вручную с помощью отладчика, чем я могу подключиться к веб-сокетов сервера без проблем.
Однако я не уверен, что вообще, как я на самом деле должен получить этот маркер, прежде чем пытаться подключиться. Я заметил, что XSRF Tokens
сохранены в таблице базы данных SECURITY_CONTEXT
. Единственная проблема заключается в том, что в этой таблице создается запись с ключом, который должен иметь после попытки подключения. Мне нужно это до, и я не уверен, что процедура для получения маркера должным образом.
Есть ли у кого-нибудь предыдущий опыт использования этих функций, которые могут пролить свет? Заранее спасибо.
EDIT Я использую версию 740 с пакетом обновления 4.
Чтобы включить, я оказался немного нетерпелив в своем поиске и закончил писать обработчик, который возвращает маркер и вводит его в запрос, а затем вызывает стандартную реализацию SAP: https: //gist.github.com/anonymous/7c784568f69239ef722f Однако это не настоящее решение, это просто взломать. –
Вы сохранили белый цвет кросс-кантри (транзакция «SAPC_CROSS_ORIGIN')? – mjturner
Я просто попробовал, у меня, похоже, нет такой сделки. –