在我以前的博客文章中,我已经能够利用SAP提供的不同平台和工具来连接我的Amazon Echo Dot,并向内部部署的后端SAP ABAP服务器发出简单请求更新SAPUI5应用程序显示并返回口头响应。
但是,我明确没有提及任何关于保护API端点的内容,也没有详细说明用户身份的验证。因此,让我们在这篇文章中讨论保护API端点的问题。
我通过触发来自第三方API工具的请求来测试我当前的API端点,该工具具有有效的JSON主体(就像Alexa将如何形成它),它实际到达了我的后端SAP服务器,并返回了有效的响应。这不是一件好事。
这意味着任何知道我的API端点的完整URL的人都可以从任何API/REST工具免费向我的后端SAP服务器发送或潜在地淹没请求。
我需要尽快找到保护我的API端点的方法!
虽然这并不重要,因为整个演示只是一个在开发者试用版ABAP服务器上运行的PoC,淘客服,但我正在寻找一个借口来试用新发布的Cloud Foundry试用版,并获得更多SAP云平台的实践经验,学生云服务器,所以我提出了这个要求!
我对上述问题的解决方案是:(1)向我的API端点添加一个新策略来验证应用程序密钥;(2)利用Cloud Foundry应用程序来验证请求是否确实是从Alexa发送的,并使用请求头中的应用程序密钥触发API端点来标识自己
以下是解决方案类似于
解决方案的第一部分是向API端点添加某种形式的身份验证。我选择添加一个策略来验证将在请求头中发送的静态应用程序密钥,在请求头中,只有授权的应用程序才能知道并在到ProxyEndpoint的预流期间进行验证。
要做到这一点,我必须在SAP Cloud Platform–API管理中执行以下三个简单步骤:
1。在API门户上创建一个产品并将其链接到API端点
2.通过在开发人员门户上创建一个应用程序来使用该产品,该应用程序将生成一个应用程序密钥
3。返回API门户并将一个新策略添加到API预流–ProxyEndpoint称为Verify API Key
一旦以上三个步骤完成,并且如果我尝试使用第三方API工具再次触发同一个API端点–我现在将得到如下错误。
但是,如果我在请求的头中设置'APIKey'并再次触发API端点,它现在将成功。
完美!我现在在我的api端点上添加了一个简单的api密钥验证,这个改变也完全打破了我现有的解决方案,因为Alexa不能再调用这个API了,企业管理平台软件,因为它不能在调用过程中传递新的HTTP头"APIKey"。
这让我们进入解决方案的第二部分。
阅读Amazon Alexa的开发者文档,了解如何将自定义技能作为web服务托管,有一些安全建议,特别是关于验证请求是否确实是由Alexa发送的,作为保护API端点不受潜在攻击的一种方法攻击者。参考: https://developer.amazon.com/public/solutions/alexa/alexa skills kit/docs/developing-an-alexa-skill-as-a-web-service#验证-请求是由alexa发出的
因为我个人的目标是尝试新的cloudfoundry,所以我希望部署一个简单的节点.js将作为新的API(1)验证请求是否来自Alexa,以及(2)使用标题"APIKey"将自己标识到API管理中发布的API端点。
在我考虑尝试从Amazon手动编写这些需求之前(考虑到我的技能,这是不可能的),在npmjs上快速搜索"alexa-verifier"返回了一些有希望的结果。太完美了!有人已经考虑过这一点,并且非常友好地将其打包到一个易于使用的npm模块中。
为了设计这个解决方案的第二部分,我把一个简单的节点.js+快递.js使用两个npm模块的应用程序–alexa verifier中间件和express http代理。
此应用程序将首先调用alexa verifier中间件来验证调用是否确实来自alexa,然后使用express http代理来硬编码标头APIKey并将请求转发给在API管理上发布的API端点。
下面是我为获得节点.js+快递.js应用程序推送到SAP Cloud Foundry.
1。在我的SAP云平台试用帐户上激活Cloud Foundry试用版。
2。在我的电脑上安装Cloud Foundry的CLI
3。设置Cloud Foundry API端点
4。登录SAP Cloud Foundry
5。将我的应用程序推送到Cloud Foundry
随着应用程序在Cloud Foundry上运行,我现在可以通过我的第三方API工具运行另一个测试,并直接向Cloud Foundry应用程序发送请求。这将是一个阴性测试。
太棒了!Cloud Foundry上部署的应用程序现在验证我从第三方API工具发送的请求不是有效的请求,因为我缺少通常在实际Alexa请求中的参数。
让我们将这个新的API端点URL更新到Amazon技能工具包(ASK)中。
Ta da!
我现在为Alexa更新了一个API端点,它是部署在Cloud Foundry上的一个应用程序,通过API管理上的一个基本API密钥验证来验证和标识自己。