在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条回答
小灯塔
2020-08-31 00:25

您好 Gaurav Karkara

非常感谢,它将起作用

我们需要添加lo_http_client-> PROPERTYTYPE_ACCEPT_COOKIE = if_http_client => co_enabled。 并且我们需要删除新的客户端创建。

这是工作代码

 *&---------------------------------------------  ------------------------ *


 *&报告ZCSRF_VALIDATION


 *&------------------------------------------------  --------------------- *


 *&


 *&------------------------------------------------  --------------------- *


 报告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-> propertytype_accept_cookie = if_http_client => co_enabled。




 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')。










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


 *


 *


 *


 *


 *" =========================带有邮寄请求的验证CSRF令牌==================  =============


 *






 *


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






 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。


 写:/'CSRF-Token:',lv_xcrf。
 

一周热门 更多>