ABAP Websocket 服务器 XSRF 令牌

ABAP Websocket Server XSRF Token

我目前正在尝试在 SAP 应用程序服务器上设置一个网络套接字服务器作为概念验证。连接到 web 套接字服务器的应用程序不会是 UI5 或 WebDynpro 应用程序,而只是无头计算机上的中间件程序 运行。

按照快速指南,我已经设置了推送通道,并且我有一个带有接口方法 ON_STARTON_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: FetchGET 请求,除了我从中获得的令牌没有'当我尝试使用 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。我建议暂时使用您的解决方法,直到您的系统被修补。