CAP应用程序的目的地

2020-08-17 22:25发布

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

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


CAP专家们!

我开发了一个可以通过浏览器正常运行的CAP应用程序。 它包含db,srv,app和approuter模块。 我的服务用@注释(需要:"已验证用户")。

一旦部署到cf,则通过调用approuter要求我登录,然后将我重定向到服务。 因此它可以按预期工作。

从SAP移动卡调用服务时,我的问题开始了。 我的移动服务服务也在Cloud Foundry上运行。

我在移动服务(SAP移动卡/功能/移动连接)中创建了一个指向我的approuter URL的目的地,并选中了sso机制"转发身份验证"和"将用户令牌转发给AppRouter"。 如 https://help.sap.com/viewer/ 468990a67780424a9e66eb096d4345bb/Cloud/zh-CN/c5896a6238ae4f11a4f0d37d483340f0.html

"当为端点配置了转发身份验证SSO机制时,将出现将用户令牌转发到AppRouter复选框。选中该复选框以启用。启用后,用户令牌将作为x-转发到app-router应用程序 approuter-authorization标头。"

正如预期的那样,在移动卡应用程序集上刷新时,我在approuter中的标题x-approuter-authorization中收到了JWT,并且该请求已转发到服务层,但是我总是收到401错误。 该错误带有注释@(requires:'authenticated-user'),因为如果删除该错误,该错误就会消失。 因此,看来approuter收到了jwt,但是服务层不知道如何正确管理它。

有什么建议吗? 我应该在目的地中使用其他sso类型吗?

提前谢谢!

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

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


CAP专家们!

我开发了一个可以通过浏览器正常运行的CAP应用程序。 它包含db,srv,app和approuter模块。 我的服务用@注释(需要:"已验证用户")。

一旦部署到cf,则通过调用approuter要求我登录,然后将我重定向到服务。 因此它可以按预期工作。

从SAP移动卡调用服务时,我的问题开始了。 我的移动服务服务也在Cloud Foundry上运行。

我在移动服务(SAP移动卡/功能/移动连接)中创建了一个指向我的approuter URL的目的地,并选中了sso机制"转发身份验证"和"将用户令牌转发给AppRouter"。 如 https://help.sap.com/viewer/ 468990a67780424a9e66eb096d4345bb/Cloud/zh-CN/c5896a6238ae4f11a4f0d37d483340f0.html

"当为端点配置了转发身份验证SSO机制时,将出现将用户令牌转发到AppRouter复选框。选中该复选框以启用。启用后,用户令牌将作为x-转发到app-router应用程序 approuter-authorization标头。"

正如预期的那样,在移动卡应用程序集上刷新时,我在approuter中的标题x-approuter-authorization中收到了JWT,并且该请求已转发到服务层,但是我总是收到401错误。 该错误带有注释@(requires:'authenticated-user'),因为如果删除该错误,该错误就会消失。 因此,看来approuter收到了jwt,但是服务层不知道如何正确管理它。

有什么建议吗? 我应该在目的地中使用其他sso类型吗?

提前谢谢!

付费偷看设置
发送
4条回答
Climb_Ma
1楼 · 2020-08-17 22:55.采纳回答
解决方案:(对某些人来说可能很明显,但是我花了很长时间才找到解决方案:))在我的方案中,SAP Mobile Cards使用CAP服务,两者都在同一个Cloud Foundry子帐户中。 在SAP Mobile Cards中,我创建了一个指向CAP应用程序approuter的目的地,该目的地使用选中的sso机制" Forward Authentication"和" Forward User Token To AppRouter"。 在运行时,SAP Mobile Card的xsuaa实例生成一个JWT,该JWT发送到approuter。 此时,在approuter应用程序日志中获得错误:
"访问令牌的客户端ID" sb-com-sap-mobile-platform-cards-XX-XX-XXXX!t3933"与\ nOAuth客户端ID" sb-XXXXX-XX-XX-XXXX"不匹配 !t3933"。\ n在环境中未指定JWT信任ACL(SAP_JWT_TRUST_ACL)。-路由来源:/^\\/(.*)$/,IP:******,x-approuter-authorization  :******'

也就是说,CAP应用程序的xsuaa不信任生成JWT的ClientId。 我们可以通过以下方式在yaml文件中将SAP_JWT_TRUST_ACL属性添加到approuter来解决此问题:

-名称:s4nabcdef-approuter
     类型:approuter.nodejs
     路径:approuter
     参数:
       磁盘配额:256M
       记忆体:256M
     要求:
       -名称:s4nabcdef-uaa
       -名称:srv_api
         组:目的地
         特性:
           forwardAuthToken:true
           名称:srv_api
           strictSSL:假
           网址:"〜{url}"
     特性:
       SAP_JWT_TRUST_ACL:
        -客户编号:" *"
          identityzone:" *"
 

使用上述方法,错误消失并且请求到达服务层。

问题解决了吗? 没门。 如果我们再试一次,现在是服务层以401进行响应,但是在这种情况下,没有其他消息可指导我们实现该解决方案。 这是当您怀疑CAP应用程序正常工作时,但是不,这与approuter中的原因完全相同。 将属性SAP_JWT_TRUST_ACL属性添加到srv模块中,即可使用。

-名称:s4nabcdef-srv
     类型:nodejs
     路径:srv
     参数:
       内存:512M
       磁盘配额:512M
     提供:
       -名称:srv_api
         特性:
           网址:$ {default-url}
     要求:
       -名称:s4nabcdef-db-hdi-container
       -名称:s4nabcdef-uaa
       -名称:s4nabcdef_destination
       -名称:s4nabcdef_connectivity
     特性:
       SAP_JWT_TRUST_ACL:
        -客户编号:" *"
          identityzone:" *" 

我希望这可以帮助某人。

最诚挚的问候,

Marc

一只江湖小虾
2楼-- · 2020-08-17 22:43

嗨, Marc Mauri

是的,它在同一个子帐户中。 我能够使其与Node.js一起使用。 我缺少参数"?auth = uaa"。

但是该解决方案不适用于JAVA,SAP确认:

" Approuter不接受通过Authorization标头解析J​​WT令牌,因此移动服务引入了一个复选框,并通过特殊标头将JWT令牌传递给approuter。
像spring-boot这样的Java应用程序始终对JWT使用Authorization标头 令牌(OAuth令牌),因此您不应选中该复选框。"

薛小明提供的第二种解决方案" OAuth2用户令牌交换" 此主题应该适用于JAVA,因为 很好,但目前不适用于试用帐户。 SAP已经对其进行了修复,它将在下一个版本中发布。 所以希望它对我有用。...然后我给你更新。

最诚挚的问候,

Chris

哎,真难
3楼-- · 2020-08-17 22:59

嗨,

请检查approuter是否设置了参数" forwardAuthToken = true"。

然后您应该尝试是否 JWT确实到达了后端。 您可以在包中配置显示令牌的端点。

在NODE中,您可以在此处找到示例:公开 CF中的JWT

在JAVA中,您可以轻松地从请求的http标头中提取字符串,然后将其粘贴到 https://jwt.io/

最诚挚的问候

MatthiasBühl

悻福寶寶
4楼-- · 2020-08-17 22:59

您好,Matthias,

非常感谢您的建议。

我的approuter模块的yaml文件中已经存在参数" forwardAuthToken = true":

-名称:s4nabcdef-approuter
     类型:approuter.nodejs
     路径:approuter
     参数:
       磁盘配额:256M
       记忆体:256M
     要求:
       -名称:s4nabcdef-uaa
       -名称:srv_api
         组:目的地
         特性:
           forwardAuthToken:true
           名称:srv_api
           strictSSL:假
           网址:"〜{url}" 

另一方面,我已经有一个显示令牌的端点,但是在执行其实现之前会出现错误401。

最后,我通过在yaml的srv模块的定义中添加SAP_JWT_TRUST_ACL属性(我已经在approuter模块中拥有它)来解决此问题,所以现在看起来像这样:

-名称:s4nabcdef-srv
     类型:nodejs
     路径:srv
     参数:
       内存:512M
       磁盘配额:512M
     提供:
       -名称:srv_api
         特性:
           网址:$ {default-url}
     要求:
       -名称:s4nabcdef-db-hdi-container
       -名称:s4nabcdef-uaa
       -名称:s4nabcdef_destination
       -名称:s4nabcdef_connectivity
     特性:
       SAP_JWT_TRUST_ACL:
        -客户编号:" *"
          identityzone:" *" 

我将通过添加错误消息和针对将来可能遇到此问题的任何人的详细解决方案,对我的第一个问题发表评论。

我非常感谢您对Matthias的协助。

问候

马克

一周热门 更多>