ABAP Websocket服务器XSRF令牌

时间:2015-08-13 08:57:58

标签: sockets sap abap

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

按照快速指南,我已经设置了推送频道,我有一个对象,其中包含接口方法ON_STARTON_MESSAGE等。我目前正在测试界面使用您可以从wscat获取npm

当我第一次使用wscat尝试连接我的服务时,我收到了HTTP 500错误。

enter image description here

我不确定为什么我收到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.

如果我使用调试器手动跳过此检查,那么我可以毫无问题地连接到我的网络套接字服务器。

enter image description here

但是我完全不确定在尝试连接之前我实际上应该如何获得此令牌。我注意到XSRF Tokens已保存在数据库表SECURITY_CONTEXT中。唯一的问题是在此表中创建了一个条目,我需要在尝试连接后 。我需要之前,我不确定正确检索令牌的步骤是什么。

是否有任何人以前使用过这些可以解决问题的经验?提前致谢。

编辑我使用的是带有Service Pack 4的版本740.

1 个答案:

答案 0 :(得分:1)

正确生成标头的“正确”方法是维护表APC_CROSS_ORIGIN(事务SAPC_CROSS_ORIGIN)。

WebSockets功能仅在7.40SP5中发布供客户使用,这可能解释了为什么您的系统中没有该表。我建议现在使用您的解决方法,直到您的系统被修补。