通过ABAP程序进行基于令牌的身份验证

2020-09-05 04:38发布

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

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


是否可以使用ABAP程序调用基于令牌的身份验证? 如果有示例代码,请分享。

谢谢

Shenal

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

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


是否可以使用ABAP程序调用基于令牌的身份验证? 如果有示例代码,请分享。

谢谢

Shenal

付费偷看设置
发送
1条回答
渐行渐远_HoldOn
1楼-- · 2020-09-05 04:55

您好,申纳尔

是的,有可能。 对于每个Https调用,将有两个调用:一个获得令牌,另一个基于该令牌执行CRUD操作。

获取令牌的示例代码:

 METHOD get_token。

     数据:lo_http_client类型参考if_http_client。

     DATA:响应TYPE字符串,

           lv_url TYPE字符串。

     常量:lv_initial_url TYPE字符串VALUE'<您的API链接>',

                lv_auth TYPE字符串VALUE'基本<您的授权数据>'。





     "通过URL创建HTTP客户端

     呼叫方法cl_http_client => create_by_url

       出口

         网址= lv_initial_url

       输入

         客户端= lo_http_client

       例外情况

         arguments_not_found = 1

         plugin_not_active = 2

         internal_error = 3

         其他= 4。

     如果sy-subrc <> 0。

       "错误处理

     万一。



     "设置请求方法

     lo_http_client-> request-> set_method('GET')。


     "添加标题

     lo_http_client-> request-> set_header_field(name ='Authorization'value = lv_auth)。


     "用于生产性API端点的可用安全方案

     " OAuth 2.0

     呼叫方法lo_http_client->发送

       例外情况

         http_communication_failure = 1

         http_invalid_state = 2

         http_processing_failed = 3

         http_invalid_timeout = 4

         其他= 5。

     如果sy-subrc = 0。

       调用方法lo_http_client-> receive

         例外情况

           http_communication_failure = 1

           http_invalid_state = 2

           http_processing_failed = 3

           其他= 5。

     万一。

     如果sy-subrc <> 0。

       "错误处理

     万一。

     响应= lo_http_client->响应-> get_cdata()。

    GV_TOKEN =响应。  "将令牌保存在全局变量中

   ENDMETHOD。

从上述响应中获取令牌并执行Read调用的示例代码:

 METHOD get_proof_history。

     数据:lo_http_client类型参考if_http_client。

     DATA:响应TYPE字符串,

           lv_url TYPE字符串,

           lv_auth TYPE字符串,

           lv_auth2 TYPE字符串。


     常量:lv_initial_url TYPE字符串VALUE'<您的API>'。



     如果iv_object_id不是INITIAL。


 ***获取令牌

       类型:

         开始进入

           access_token TYPE字符串,

           token_type TYPE字符串,

           expires_in TYPE n LENGTH 8,

           作用域TYPE字符串,

           jti TYPE字符串,

         t_entry的结尾。

       类型:

         t_entry_map t_entry的类型排序表,具有唯一键access_token。

       数据:m_entries类型t_entry。


       数据:lr_instance类型引用至/ui5/cl_json_parser。

       创建对象lr_instance。

       呼叫方法-> get_token。

       如果gv_token不是INITIAL。  "在这里检索您的令牌

       /ui2/cl_json =>反序列化(

         导出json = gv_token pretty_name =/ui2/cl_json => pretty_mode-camel_case更改数据= m_entries)。

         lv_auth2 = m_entries-access_token。

         gv_token = gv_token + 17。

         CONCATENATE'Bearer'lv_auth2 INTO lv_auth由空格分隔。  "使用令牌值创建您的授权码
       万一。

       DATA lv_object_id TYPE字符串。

       lv_object_id = iv_object_id。

       将lv_object_id转换为小写。

       CONCATENATE lv_initial_url lv_object_id INTO lv_url。  "附加修订URL和对象ID以获取请求URL

       "通过URL创建HTTP客户端

       呼叫方法cl_http_client => create_by_url

         出口

           网址= lv_url

         输入

           客户端= lo_http_client

         例外情况

           arguments_not_found = 1

           plugin_not_active = 2

           internal_error = 3

           其他= 4。

       如果sy-subrc <> 0。

         "错误处理

       万一。


       "设置请求方法

       lo_http_client-> request-> set_method('GET')。

       "添加标题

       lo_http_client-> request-> set_header_field(name ='Accept'value ='application/json')。

       lo_http_client-> request-> set_header_field(name ='Authorization'value = lv_auth)。

       "用于生产性API端点的可用安全方案

       " OAuth 2.0

       呼叫方法lo_http_client->发送

         例外情况

           http_communication_failure = 1

           http_invalid_state = 2

           http_processing_failed = 3

           http_invalid_timeout = 4

           其他= 5。

       如果sy-subrc = 0。

         调用方法lo_http_client-> receive

           例外情况

             http_communication_failure = 1

             http_invalid_state = 2

             http_processing_failed = 3

             其他= 5。

       万一。


       如果sy-subrc = 1。

         "错误处理

         ev_response ='http_communication_failure'。

       ELSEIF sy-subrc = 2。

         ev_response ='http_invalid_state'。

       ELSEIF sy-subrc = 3。

         ev_response ='http_processing_failed'。

       ELSEIF sy-subrc = 0。

         响应= lo_http_client->响应-> get_cdata()。

 * WRITE:"响应:",响应。

         ev_response =响应。

       其他。

         ev_response ='未知错误'。

       万一。

     万一。

   ENDMETHOD。

一周热门 更多>