在ABAP中将CSRF令牌用于POST请求

2020-08-31 00:13发布

点击此处---> 群内免费提供SAP练习系统(在群公告中)加入QQ群:457200227(SAP S4 HANA技术交流) 群内免费提供SAP练习系统(在群公告中)嗨,专家 在CSRF令牌的上下...

         点击此处--->   EasySAP.com群内免费提供SAP练习系统(在群公告中)

加入QQ群:457200227(SAP S4 HANA技术交流) 群内免费提供SAP练习系统(在群公告中)


嗨,专家

在CSRF令牌的上下文中在ABAP报告中使用REST POST操作时遇到问题。

问题:在这里,我收到 403错误的请求, CSRF令牌验证失败。 ,即使我正在传递令牌和会话

,但其余客户端也可以使用。

这是报告代码

1)第一部分获得令牌

2)验证令牌

如何解决此问题

报告zcsrf_validation。





 数据lo_client类型参考if_http_client。

 数据lo_response类型参考if_rest_entity。

 DATA lv_response TYPE字符串。

 DATA lv_token TYPE字符串。

 DATA lv_session TYPE字符串。

 DATA lv_xcrf TYPE字符串。

 DATA lv_http_status TYPE字符串。

 DATA gc_content_type_form TYPE字符串VALUE'application/json;  charset = utf-8'。

 DATA gc_url TYPE字符串值'https://hana.xyz.net:8081/sap/ca/gef/arcgis/rest/services/EQ_A_E/featureserver/0/applyEdits'。





 " =======================================================  ==================



 cl_http_client => create_by_url(

     出口

       网址= gc_url

     输入

       客户= lo_client

     例外情况

       其他= 4)。



 lo_client-> request-> set_content_type(content_type = gc_content_type_form)。



 lo_client-> request-> set_method(if_http_request => co_request_method_get)。



 lo_client-> authenticate(

   出口

     client ='100'" R/3系统(登录时的客户端编号)

     username ='user'" ABAP系统,用户登录名

     password ='password'"登录ID

    语言= sy-langu)。  " SAP系统,当前语言



 lo_client-> request-> set_header_field(

   出口

     name ='X-CSRF-Token'"标头字段的名称

     value ='Fetch')。



 lo_client->发送(

       例外情况

         http_communication_failure = 1

         http_invalid_state = 2

         http_processing_failed = 3

         http_invalid_timeout = 4

         其他= 5)。





 lo_client-> receive(

   例外情况

     http_communication_failure = 1

     http_invalid_state = 2

     http_processing_failed = 3

     其他= 4)。





 lv_token = lo_client-> response-> get_header_field('X-CSRF-Token')。

 lv_session = lo_client-> response-> get_header_field('set-cookie')。



 lo_client-> close()。

 免费lo_client。

 " =========================== CSRF令牌获取结束=================  ===================





 " =========================带有Post request的验证CSRF令牌==================  =======



 cl_http_client => create_by_url(

     出口

       网址= gc_url

     输入

       客户= lo_client

     例外情况

       其他= 4)。



 lo_client-> request-> set_content_type(content_type = gc_content_type_form)。



 lo_client-> request-> set_method(if_http_request => co_request_method_post)。



 lo_client-> authenticate(

   出口

     client ='100'" R/3系统(登录时的客户端编号)

     username ='user'" ABAP系统,用户登录名

     password ='password'"登录ID

    语言= sy-langu)。



 lo_client-> request-> set_header_field(

   出口

     name ='X-CSRF-Token'"标头字段的名称

     值= lv_token)。



 lo_client-> request-> set_form_field(

   出口

     name ='Cookie'"表单字段名称

     值= lv_session)。





 lo_client->发送(

       例外情况

         http_communication_failure = 1

         http_invalid_state = 2

         http_processing_failed = 3

         http_invalid_timeout = 4

         其他= 5

     )。



 lo_client-> receive(

   例外情况

     http_communication_failure = 1

     http_invalid_state = 2

     http_processing_failed = 3

     其他= 4)。



 lv_http_status = lo_client-> response-> get_header_field('〜status_code')。

 lv_response = lo_client-> response-> get_header_field('〜status_reason')。

 lv_xcrf = lo_client-> response-> get_header_field('x-csrf-token')。



 WRITE:/'Satus:',lv_http_status。

 WRITE:/'Response:',lv_response。

 WRITE:/'CSRF-Token:',lv_xcrf。
2条回答
SKY徐
2020-08-31 00:26 .采纳回答

嗨,哈里斯,

您可以尝试在客户端中启用Cookie接受吗?

 lo_http_client-> PROPERTYTYPE_ACCEPT_COOKIE = if_http_client => co_enabled。

GK

一周热门 更多>