SAP ABAP Netweaver服务器的标准登录方式讲解

最近Jerry把这个公众号之前发布的总共230篇文章按照类别整理了一系列合集出来,比如所有的ABAP文章,放在了这个合集里:汪子熙的ABAP合集。

SAP ABAP Netweaver服务器的标准登录方式讲解_第1张图片

本文继续介绍ABAP里的一个知识点:ABAP Netweaver服务器的登录方式(Standard Logon Procedure).

本文的英文版最先发布于SAP社区博客,我当时负责处理客户报过来的关于SAP CRM Web Service的incident,遇到一个HTTP 401错误消息的知识点,发现我理解得不够清楚,因此把SAP帮助文档找来研究了一番,写下了这篇博客:

Learn more detail about Standard logon procedure

我们在事务码SICF里随便打开一个节点,在标签页Logon Data里发现Procedure这个字段,设置的默认值为Standard,按F1可以查看帮助文档。

SAP ABAP Netweaver服务器的标准登录方式讲解_第2张图片

如果对于SICF节点在ABAP Netweaver服务器里扮演的角色感兴趣,可以参考Jerry的文章:一个13年ABAP老兵的建议:了解这些基础知识,对ABAP开发有百利而无一害。

Logon Procedure帮助文档链接:
https://help.sap.com/saphelp_me60/helpdata/en/a9/c8b14025a5c54ee10000000a1550b0/content.htm?no_cache=true

文档提到,当Procedure设置为Standard时,登录验证将会通过下面的顺序进行:

SAP ABAP Netweaver服务器的标准登录方式讲解_第3张图片

(1) Logon using HTTP fields
(2) Logon with SSL certificates
(3) Logon using SAP Logon Ticket (SSO)
(4) HTTP Basic Authentication
(5) Logon using SAP user password (SAP RFC logon)
(6) Logon using SAML
(7) Logon using user data stored in the service

下面我们就通过一些具体的例子,来理解这些不同的登录方式是如何进行的。

例如直接在浏览器里打开某Web Service的WSDL url:

http://:50078/sap/bc/srt/wsdl/flv_10002A111AD1/bndg_url/sap/bc/srt/rfc/sap/zws_add/506/zjerry1/jerry1?sap-client=506

输入url敲回车,我能看到期望中的WSDL内容。然而我还观察到了一些有趣的现象:地址栏里的http自动被转换成了https,同时工具HTTP Watch里观察到了一个HTTP 307重定向。

SAP ABAP Netweaver服务器的标准登录方式讲解_第4张图片

这个从HTTP协议端口50078自动重定向到HTTPS端口44378的行为,定义在事务码SMICM的参数里:

SAP ABAP Netweaver服务器的标准登录方式讲解_第5张图片

也可以通过事务码RZ11,查看参数icm/HTTP/redirect_0的值。

然而,此时我根本没有指定任何用户名和密码,为什么我可以成功看到部署在ABAP Netweaver服务器上,需要通过登录认证后才能访问的资源?

这就是标准登录方式之一的Logon using SAP Logon Ticket (SSO-单点登录)在起作用。

摘录一段SAP帮助文档里对Logon using SAP Logon Ticket (SSO)的说明:

Logon using SAP Logon Ticket (MYSAPSSO2 cookie field). If no logon data is transferred as form fields or header fields, the system then tries to log on using a logon ticket. To enable this, the cookie field MYSAPSSO2 must be set.

用HTTP Watch(Chrome开发者工具也行)观察我访问WSDL发起的HTTP请求,果然发现了一个名为MYSAPSSO2的cookie,这是我之前成功登录服务器之后,服务器颁发给客户端的logon ticket. 登录成功之后,接下来每次再访问同一服务器时,浏览器都会自动将该cookie设置到HTTP请求里,达到无需用户显式提供登录信息,也能成功访问服务器资源的目的。

SAP ABAP Netweaver服务器的标准登录方式讲解_第6张图片

当我将这个MYSAPSSO2 cookie清除之后,再次访问同一资源,又看到了久违的让我输入用户名和密码的弹出对话框。

SAP ABAP Netweaver服务器的标准登录方式讲解_第7张图片

这次输入用户名和密码之后,再次看到了WSDL内容,然而此次成功登录,采用的方式不是之前的MYSAPSSO2 Logon Ticket,而是基于用户名和密码的Basic Authentication方式(下图蓝色高亮区域)。

注意到下图绿色高亮区域的set-cookie:用户成功登录后,服务器颁发的MYSAPSSO2 cookie,通过HTTP响应的set-cookie字段, 返回给浏览器。下一次浏览器再访问该资源时,会自动在HTTP请求里带上该cookie字段,又重新使用MYSAPSSO2 Logon Ticket的方式进行登录认证了。

SAP ABAP Netweaver服务器的标准登录方式讲解_第8张图片

下面是几种通过ABAP代码来访问Netweaver服务器资源时,如何指定登录认证信息的例子。

例1:ABAP代码里未提供任何登录认证信息

SAP ABAP Netweaver服务器的标准登录方式讲解_第9张图片

SAPGUI里执行上图的ABAP代码,会遇到一个弹出对话框,只有手动输入用户名和密码,该代码才能顺利取回资源。

SAP ABAP Netweaver服务器的标准登录方式讲解_第10张图片

如果添加一行代码:

lo_http_client->propertytype_logon_popup = if_http_client=>co_disabled.

可以阻止用户名和密码输入的对话框弹出,但此时服务器会直接返回HTTP 401 Unauthorized Error:

SAP ABAP Netweaver服务器的标准登录方式讲解_第11张图片

例2:在ABAP程序里提供用户名和密码的几种方式

可以通过如下方式提供明文的用户名和密码:

也可以在事务码SM59里创建一个类型为H:HTTP Connection to ABAP System的Destination:

SAP ABAP Netweaver服务器的标准登录方式讲解_第12张图片

将用户名和密码维护到这个Destination的Logon & Security页面的对应字段去:

SAP ABAP Netweaver服务器的标准登录方式讲解_第13张图片

然后基于这个Destination创建cl_http_client的实例。这种方式安全性比在代码里直接明文指定用户名和密码要好一些。

SAP ABAP Netweaver服务器的标准登录方式讲解_第14张图片

当然我也试过,将MYSAPSSO2的cookie值拷贝出来:

SAP ABAP Netweaver服务器的标准登录方式讲解_第15张图片

直接通过set_cookie方法设置给cl_http_client的实例,一样可以成功访问系统里的资源。

SAP ABAP Netweaver服务器的标准登录方式讲解_第16张图片

只是cookie有时效性,会过期,因此在生产场景的代码中,需要现用现取。关于ABAP CL_HTTP_CLIENT有关cookie的详细使用方式,请参考我的博客:

Regarding cookie manipulation in CL_HTTP_CLIENT to avoid CSRF token validation failure issue

大家下次如果遇到有关HTTP请求和服务器登录认证的相关问题,不妨按照Jerry本文介绍的方法,通过使用HTTP Watch和Chrome开发者工具,以及查阅SAP帮助文档的方式自行研究,感谢阅读。

ABAP专题

  • Jerry的ABAP, Java和JavaScript乱炖

  • ABAP开发人员未来应该学些什么

  • Jerry 2017年的五一小长假:8种经典排序算法的ABAP实现

  • Jerry的ABAP原创技术文章合集

  • 300行ABAP代码实现一个最简单的区块链原型

  • 使用Java+SAP云平台+SAP Cloud Connector调用ABAP On-Premise系统里的函数

  • 在SAP云平台的CloudFoundry环境下消费ABAP On-Premise OData服务

  • ABAP vs Java, 蛙泳 vs 自由泳

  • 聊聊C语言和ABAP

  • 动手使用ABAP Channel开发一些小工具,提升日常工作效率

  • 我用ABAP做过的那些无聊的事情

  • 不喜欢SAP GUI?那试试用Eclipse进行ABAP开发吧

  • 使用Visual Studio Code编写和激活ABAP代码

  • 你的ABAP程序给佛祖开过光么?来试试Jerry这个小技巧

  • 在SAP云平台ABAP编程环境上编写第一段ABAP程序

  • SAP官方发布的ABAP编程规范

  • ABAP Code Inspector那些隐藏的功能,您都知道吗?

  • 还在用ABAP进行SAP产品的二次开发?来了解下这种全新的二次开发理念吧

  • ABAP Netweaver体内的那些寄生式编程语言

  • 从SAP社区上的一篇博客开始,聊聊SAP产品命名背后的那份情怀

  • 云端的ABAP Restful服务开发

  • 如何在SAP云平台ABAP编程环境里把CDS view暴露成OData服务

  • 使用abapGit在ABAP On-Premises系统和SAP云平台ABAP环境之间进行代码传输

  • 30分钟用Restful ABAP Programming模型开发一个支持增删改查的Fiori应用

  • Jerry带您了解Restful ABAP Programming模型系列之二:Action和Validation的实现

  • Jerry带您了解Restful ABAP Programming模型系列之三:云端ABAP应用调试

  • SAP云平台上的ABAP编程环境里如何消费第三方服务

  • ABAP开发者上云的时候到了 - 现在大家可以免费使用SAP云平台ABAP环境的试用版了

  • 学而不思则罔 - SAP云平台ABAP编程环境的由来和适用场景

  • SAP云平台里的三叉戟应用

  • 如何基于Restful ABAP Programming模型开发并部署一个支持增删改查的Fiori应用

  • SAP 2019 TechEd Key Note解读:云时代下SAP从业人员如何做二次开发?

  • 有哪些ABAP关键字和语法,到了ABAP云环境上就没办法用了?

  • ABAP开发环境终于支持以驼峰命名法自动格式化ABAP变量名了

  • 利用ABAP 740的新关键字REDUCE完成一个实际工作任务

  • 一段让人瑟瑟发抖的ABAP代码

  • 昨日万圣节ABAP怪兽级代码谜团,公布答案啦

  • 介绍一种在ABAP内核态进行内表高效拷贝的方法

  • 使用SAP Cloud Application Programming模型开发OData的一个实际例子

  • 当ABAP遇见普罗米修斯

  • 使用ABAP绘制可伸缩矢量图

  • ABAP开发环境语法高亮的那些事儿

  • SAP错误消息调试之七种武器:让所有的错误消息都能被定位

  • 使用ABAP操作Excel的几种方法

  • SAP GUI里的收藏夹事务码管理工具

  • SAP GUI和Windows注册表

  • 有了Debug权限就能干坏事?小心了,你的一举一动尽在系统监控中

  • ABAP CCDEF, CCIMP, CCMAC, CCAU, CMXXX这些东东是什么鬼

  • 实现ABAP条件断点的三种方式

  • 使用SAT跟踪监控从浏览器打开的SAP应用的性能和调用栈

  • 一个13年ABAP老兵的建议:了解这些基础知识,对ABAP开发有百利而无一害

  • SAP ABAP Netweaver容器化, 不可能完成的任务吗?

  • SAP产品增强技术回顾

  • SAP API开发方法大全

  • 浅谈Java和SAP ABAP的静态代理和动态代理,以及ABAP面向切面编程的尝试

  • SAP ABAP应用服务器的HTTP响应状态码(Status Code)

  • SAP ABAP里存在Java List这种集合工具类么?CL_OBJECT_COLLECTION了解一下

  • ABAP面试题系列:写一组会出现死锁(Deadlock)的ABAP程序

要获取更多Jerry的原创文章,请关注公众号"汪子熙":

你可能感兴趣的:(Jerry,Wang的原创SAP技术文章,ABAP,CRM)