如何在目的地中使用OAuth2ClientCredentials?

2020-08-18 08:54发布

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

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


我正在使用OAuth保护SCP业务规则API,如本博客

然后,我试图使用UI5中的另一个目标来访问业务规则。

由于业务规则现在受OAuth保护,因此我尝试使用OAuth2ClientCredentials身份验证类型配置目标。 但是,当从UI5调用业务规则时,使用目标的调用仅检索500 Internal Server Error,而没有其他内容。 目的地上的检查连接按钮返回"失败原因:"目前无法检查。请稍后重试"。

请你帮我这个忙吗?

谢谢

巴拉

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

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


我正在使用OAuth保护SCP业务规则API,如本博客

然后,我试图使用UI5中的另一个目标来访问业务规则。

由于业务规则现在受OAuth保护,因此我尝试使用OAuth2ClientCredentials身份验证类型配置目标。 但是,当从UI5调用业务规则时,使用目标的调用仅检索500 Internal Server Error,而没有其他内容。 目的地上的检查连接按钮返回"失败原因:"目前无法检查。请稍后重试"。

请你帮我这个忙吗?

谢谢

巴拉

付费偷看设置
发送
3条回答
梦想连接
1楼 · 2020-08-18 08:57.采纳回答

你好,巴拉,

对不起,我回答这么长。 该主题是一个相当新的主题,需要一些透彻的解释,以便您了解发生了什么。

您是否尝试过通过邮递员执行相同的呼叫?

我已经在Cloud中创建了oauth客户端 Java应用程序的座舱(仅用于测试)。 我了解BPM/BRM会将其端点部署为Java应用程序,并且将以相同的方式工作。 使用"授权授予"类型"客户端凭据"创建客户端。 这样,您就可以使用" id"作为用户名,并使用" secret"作为您的初始请求的密码:

 https://oauthasservices-  .hanatrial.ondemand.com/oauth2/api/v1/token?grant_type = client_credentials 

这将为您提供一个承载令牌,例如:

 {
     " access_token":" sjhdgdgasuygdsuygdasuydgsdu",
     " token_type":"承载者",
     " expires_in":3600,
     "范围": ""
 }
 

拥有此访问令牌后,您可以通过在标头中发送令牌来调用实际的服务端点:

授权:承载sjhdgdgasuygdsuygdasuydgsdu 

您 也可以使用OAuth v2.0方法尝试邮递员。 但是,我无法使授予类型" Client Credentials"在SCP上起作用(也许是因为我对Postman并不那么熟悉)。 我已经使用"授权代码"授予类型代替了Postman。

授予类型:授权代码
 回调URL:<您的BRM端点>
 验证网址:https://oauthasservices-  trial.hanatrial.ondemand.com/oauth2/api/v1/authorize
 访问令牌URL:https://oauthasservices- <帐户> .hanatrial.ondemand.com/oauth2/api/v1/token
 客户端ID:<44444444-1234-aaaa-bbbb-ffffffffffff>
 客户机密:<密码>
 客户端身份验证:作为基本Auth标头发送<-----这很重要

,然后在Cloud Cockpit中,需要为您的brm端点创建一个"授权授权:授权代码"的OAuth客户端,并将"机密"设置为true。 重定向URL也应与您的BRM端点相同。

如果以上方法适用于邮递员,则说明您已经完成了一半。 在能够使用BRM目标之前,下一步是使用Java(作为API代理)实现BRM服务调用,以避免在JavaScript代码中公开OAuth客户端ID,密码等。

不幸的是,在Neo环境中,OAuth2ClientCredentials身份验证方法目前仅受Java应用程序支持(不确定您是否也可以在XSJS上使用它-不确定。请确保您可以创建一个安全地获取令牌的XSJS应用程序,而无需使用OAuth2ClientCredentials目标 身份验证方法)。

目标服务以安全的方式存储数据(密钥,机密等)。 但是,HTML5应用程序无论如何都会公开Bearer令牌,因为您需要发出两个请求来从服务中加载数据,而这必须在JavaScript中实现。 我认为这被认为是安全风险。 因此,我认为HTML5应用程序不允许使用这种身份验证方法。 也许有计划在将来实施它,但我不是持这种回答的人。

以OAuth受保护的服务为例,那些将代表业务用户调用的服务。 换句话说,这意味着您的业务服务(可能是OData服务)将执行对BRM的调用,以确定业务用户的折扣。 在这种情况下,您实际上不需要让业务用户直接向BRM服务进行身份验证。 相反,您可以通过OAuth委派身份验证,以便您的OData服务实现可以执行调用并将数据返回给最终用户。 考虑到这一点,应该仅通过调用OData服务来简化UI,因为在这种情况下,业务用户身份验证才是真正相关的,并且目标服务可以使用。

此身份验证方法对于Neo和CF都是相当新的 。 因此,您不会在其中找到很多博客。 即使开发自己的API Java代理也不难。 请记住:

1)类 HttpDestination 已准备好使用预配置的Apache HttpClient,并将执行自动访问令牌检索和缓存。 因此,您无需创建POST请求,获取令牌并仅需访问BRM端点即可。 您真正需要的只是使用OAuth2ClientCredentials目标身份验证方法的目标。

2)ConnectivityConfiguration和AuthenticationHeaderProvider类将帮助您与目标配置和要发送到API的标头进行交互。

此外,在过去,我曾经建议使用OAuth作为保护HTML5应用程序中的API密钥的选项,但实际上并不建议这样做。 我还看到了一些示例和练习,其中使用JavaScript完成了通过OAuth来获取Bearer身份验证令牌的方法,这正是您应该避免的-但在这种情况下,安全性并不重要。

希望这会有所帮助 。

最好的问候,
伊万

xfwsx85
2楼-- · 2020-08-18 09:00

伊万,嗨,

感谢您介绍目的地中的OAuth2ClientCredentials身份验证类型。

我已经使用Postman的OAuth 2.0成功调用了BRM服务。 现在,我的下一步是使用目标调用受OAuth 2保护的BRM。 我以UI5为例来简化问题。

我了解我们可能不希望在UI5应用程序中调用获取OAuth访问令牌的方法-这显然会将client_secret暴露给使用该应用程序的任何人。 但是,我不了解通过目标使用OAuth2ClientCredentials的目标调用服务的安全风险。 请您详细说明一下风险。

谢谢

Bala

SAP砖家
3楼-- · 2020-08-18 09:09

嗨,Bala

如果您在Java Destinations API中将目标与OAuth2ClientCredentials一起使用,就可以了。 对于任何服务器端技术都是如此。

(我将澄清先前的答案)我指的目标纯文本内容不是写入其中的安全数据(您存储的内容) 通过Cockpit),但具有以下特定用例。

要不能够对任何安全的东西(机密,密钥,ID)进行硬编码,您需要使用一个目的地来获取令牌(使用 AJAX请求中的POST方法,其中用户/密码存储在为基本身份验证配置的目标中),另一种方法是获取数据(使用没有身份验证的目标,并使用已设置正确的Bearer标头变量和获取的令牌执行GET)。

我想说这对于测试和练习是可以的,但是很难使其真正安全。 您将必须在受oauth保护的资源上实施CSRF保护,并将oauth令牌设置为具有非常短的寿命(可能约为10秒)-oauth客户端在SCP上的最短寿命为1分钟。 这不应该被认为是最佳的,因为一个聪明的人可以在不到1分钟的时间内用"被盗"的令牌造成实际损失。 请记住,通过按F12键,只需检查浏览器发出的请求就可以捕获oauth令牌。

最好的问候,
Ivan

一周热门 更多>