我目前正在尝试在SAP应用服务器上设置Web套接字服务器作为概念验证。连接到Web套接字服务器的应用程序不是UI5或WebDynpro应用程序,而只是在无头计算机上运行的中间件程序。
按照快速指南,我已经设置了推送频道,我有一个对象,其中包含接口方法ON_START
,ON_MESSAGE
等。我目前正在测试界面使用您可以从wscat
获取npm
。
当我第一次使用wscat
尝试连接我的服务时,我收到了HTTP 500错误。
我不确定为什么我收到500错误,所以我尝试通过http和网络浏览器访问该网址,看看发生了什么。
500 SAP Internal Server Error
ERROR: Cross-Site Request Forgery (XSRF) check has failed ! (termination: ABORT_MESSAGE_STATE)
我已经看到这些令牌也被Gateway服务使用了,所以我创建了一个快速网关服务并发送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
中。唯一的问题是在此表中创建了一个条目,我需要在尝试连接后 。我需要之前,我不确定正确检索令牌的步骤是什么。
是否有任何人以前使用过这些可以解决问题的经验?提前致谢。
编辑我使用的是带有Service Pack 4的版本740.
答案 0 :(得分:1)
正确生成标头的“正确”方法是维护表APC_CROSS_ORIGIN
(事务SAPC_CROSS_ORIGIN
)。
WebSockets功能仅在7.40SP5中发布供客户使用,这可能解释了为什么您的系统中没有该表。我建议现在使用您的解决方法,直到您的系统被修补。