ABAP Websocket 服务器 XSRF 令牌
ABAP Websocket Server XSRF Token
我目前正在尝试在 SAP 应用程序服务器上设置一个网络套接字服务器作为概念验证。连接到 web 套接字服务器的应用程序不会是 UI5 或 WebDynpro 应用程序,而只是无头计算机上的中间件程序 运行。
按照快速指南,我已经设置了推送通道,并且我有一个带有接口方法 ON_START
、ON_MESSAGE
等的对象。我目前正在使用 [= 测试接口14=] 你可以从 npm
得到。
当我第一次尝试使用 wscat
连接到我的服务时,我收到了 HTTP 500 错误。
我不确定为什么会收到 500 错误,所以我尝试通过 http 和网络浏览器访问 URL 以查看发生了什么。
500 SAP Internal Server Error
ERROR: Cross-Site Request Forgery (XSRF) check has failed ! (termination: ABORT_MESSAGE_STATE)
我看到这些令牌也被网关服务使用,所以我创建了一个快速网关服务并发送了一个带有 X-CSRF-Token: Fetch
的 GET
请求,除了我从中获得的令牌没有'当我尝试使用 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
保存在数据库 table SECURITY_CONTEXT
中。唯一的问题是在此 table 中创建了一个条目,其中包含我在尝试连接 后需要 的密钥。我在 before 之前需要它,但我不确定正确检索令牌的过程是什么。
有没有人有使用这些经验的人可以提供一些启示?提前致谢。
编辑 我正在使用带有 Service Pack 4 的版本 740。
"correct" 正确生成 header 的方法是维护 table APC_CROSS_ORIGIN
(事务 SAPC_CROSS_ORIGIN
)。
WebSockets 功能仅在 7.40SP5 中发布供客户使用,这可能解释了为什么您的系统中没有 table。我建议暂时使用您的解决方法,直到您的系统被修补。
我目前正在尝试在 SAP 应用程序服务器上设置一个网络套接字服务器作为概念验证。连接到 web 套接字服务器的应用程序不会是 UI5 或 WebDynpro 应用程序,而只是无头计算机上的中间件程序 运行。
按照快速指南,我已经设置了推送通道,并且我有一个带有接口方法 ON_START
、ON_MESSAGE
等的对象。我目前正在使用 [= 测试接口14=] 你可以从 npm
得到。
当我第一次尝试使用 wscat
连接到我的服务时,我收到了 HTTP 500 错误。
我不确定为什么会收到 500 错误,所以我尝试通过 http 和网络浏览器访问 URL 以查看发生了什么。
500 SAP Internal Server Error
ERROR: Cross-Site Request Forgery (XSRF) check has failed ! (termination: ABORT_MESSAGE_STATE)
我看到这些令牌也被网关服务使用,所以我创建了一个快速网关服务并发送了一个带有 X-CSRF-Token: Fetch
的 GET
请求,除了我从中获得的令牌没有'当我尝试使用 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
保存在数据库 table SECURITY_CONTEXT
中。唯一的问题是在此 table 中创建了一个条目,其中包含我在尝试连接 后需要 的密钥。我在 before 之前需要它,但我不确定正确检索令牌的过程是什么。
有没有人有使用这些经验的人可以提供一些启示?提前致谢。
编辑 我正在使用带有 Service Pack 4 的版本 740。
"correct" 正确生成 header 的方法是维护 table APC_CROSS_ORIGIN
(事务 SAPC_CROSS_ORIGIN
)。
WebSockets 功能仅在 7.40SP5 中发布供客户使用,这可能解释了为什么您的系统中没有 table。我建议暂时使用您的解决方法,直到您的系统被修补。