2

我正在Bluemix 上构建一个带有Cloudant 数据存储的Angular SPA。

由于 OpenWhisk 的 Bluemix 实现不使用 VCAP 服务,因此我看到了 3 个选项来使用 OpenWhisk 作为我的 api 提供程序来为我的 Angular 应用程序进行云查询:

  1. 遵循此处所示的传递凭证模式:https ://github.com/IBM-Bluemix/openwhisk-visionapp (顺便说一句非常有趣的方法)
  2. 包括我在本地运行的凭据,如下所示:https ://github.com/IBM-Bluemix/nodejs-cloudant/blob/master/app.js
  3. 使用此处所示的 http API:https ://docs.cloudant.com/api.html (突出显示传递凭据的安全问题。

由于我的服务不是为了发布(它是为了我自己的应用程序),我认为选项 2 是我的“万恶之源”选择。我错过了什么吗?我的想法是,虽然对更改很脆弱,但它是最安全的,因为凭据不会公开传递。无服务器基础设施将不得不被黑客入侵......

提前致谢!

(冗长)更新:(提前道歉)

我已经走得更远了,但仍然没有答案 - 现在被困在执行中。

澄清一下,我的目标是让应用程序从 Angular Client -> OpenWhisk -> Cloudant 流出。

在这个最简单的用例中,我想传递一个 startTime 参数和一个 endTime 参数,让 OpenWhisk 获取该时间范围内的所有记录以及所有字段,然后传回选定的字段。在我的示例中,我有经过修改的 GeoJSON 格式的 USGS 地震数据。

根据以下文章中的信息,我得出结论,我可以调用 wsk 命令行操作并使用我在 Javascript 函数中设置的绑定,因此不会将我的凭据传递给数据库。这给了我一定程度的安全性(仍然质疑我的 OpenWhisk 操作的其余端点),但我认为,一旦我的示例运行起来,我就会考虑其中的那一部分。

我的命令行(有效): wsk action invoke /my@orgname.com_mybluemixspace/mycfAppName/exec-query-find --blocking --result --param dbname perils --param query {\"selector\":{\"_id\":{\"$gt\":0},\"properties.time\":{\"$gt\":1484190609500,\"$lt\":1484190609700}}}

这成功返回以下内容:
{ "docs": [ { "_id": "eq1484190609589", "_rev": "1-b4fe3de75d9c5efc0eb05df38f056a65", "dbSaveTime": 1.484191201099e+12, "fipsalpha": "AK", "fipsnumer": "02", "geometry": { "coordinates": [ -149.3691, 62.5456, 0 ], "type": "Point" }, "id": "ak15062242", "properties": { "alert": null, "cdi": null, "code": "15062242", "detail": "http://earthquake.usgs.gov/earthquakes/feed/v1.0/detail/ak15062242.geojson", "dmin": null, "felt": null, "gap": null, "ids": ",ak15062242,", "mag": 1.4, "magType": "ml", "mmi": null, "net": "ak", "nst": null, "place": "45km ENE of Talkeetna, Alaska", "rms": 0.5, "sig": 30, "sources": ",ak,", "status": "automatic", "time": 1.484190609589e+12, "title": "M 1.4 - 45km ENE of Talkeetna, Alaska", "tsunami": 0, "type": "earthquake", "types": ",geoserve,origin,", "tz": -540, "updated": 1.484191127265e+12, "url": "http://earthquake.usgs.gov/earthquakes/eventpage/ak15062242" }, "type": "Feature" } ] }

我在 OpenWhisk(如下)中创建的操作返回内部服务器错误。我将输入值传递为
{ "startTime": "1484161200000", "endTime": "1484190000000" }

这是我的操作的代码:

`var openWhisk = require('openwhisk');
var ow = openWhisk({
    api_key:'im really a host'
});

function main(params) {

  return new Promise(function(resolve, reject) {
  ow.actions.invoke({
    actionName:'/my@orgname.com_mybluemixspace/mycfAppName/exec-query-find',
    blocking:true,
    parameters:{
      dbname: 'perils',
      query:  {
        "selector": {
          "_id": {
            "$gt": 0
          },
          "properties.time": {
            "$gt": params.startTime,
            "$lt": params.endTime
          }
        }
      }
    }
    }).then(function(res) {
            //get the raw result
            var raw = res.response.result.rows;
            //lets make a new one
            var result = [];
            raw.forEach(function(c) {
                result.push({id:c.docs._id, time:c.docs.properties.time, title:c.docs.properties.title});
            });
            resolve({result:result});
        });
    });
}`

以下是我研究的链接:http: //infrastructuredevops.com/08-17-2016/news-openwhisk-uniq.html
有用,因为使用了 exec-query-find 和选择器语法用法,但也很酷我需要为填充数据而构建的更新功能!

https://www.raymondcamden.com/2016/12/23/going-serverless-with-openwhisk
@csantanapr 引用的文章

我忽略了什么吗?

谢谢!

4

1 回答 1

3

我假设您尝试做的是直接从浏览器的角度客户端代码访问您的 Cloudant DB。

如果您不需要任何业务逻辑,或者您可以通过使用 Cloudant 功能(设计文档、视图、地图、reduce 等)来摆脱困境,并且您正在生成具有特定访问权限(即写入与读取)的 Cloudant API 密钥,那么您就不需要服务器或无服务中间件/层。

但现在让我们变得真实,大多数人都需要该层,如果您正在寻找 OpenWhisk,那么您很幸运,这很容易做到。

Bluemix 上的 OpenWhisk 支持 VCAP 服务凭证,但方式不同。假设您有一个 Bluemix Orgcarlos@example.comdev将转换为 OpenWhisk 名称空间的空间carlos@example.com_dev

如果您在 Bluemix 的空间下添加 Cloudant 服务dev,这将为此 Cloudant 帐户生成服务密钥凭证。此凭据为您提供超级权限,这意味着您是管理员。

如果您想在 OpenWhisk 中使用此 Cloudant 凭证,您可以使用使用 cloudant 包生成的自动绑定。为此,请使用 OpenWhisk CLI 运行,wsk package refresh这将提取 Cloudant 凭据并创建一个新包,并将凭据绑定为该包下所有 Cloudant 操作的默认参数。这是上面#1的修改版本

另一种选择是将凭据手动绑定到包或操作作为默认参数,当您不想使用超级管理员凭据并且为特定数据库生成 Cloudant API 密钥时,这是有意义的。这是上面的选项#1。

我不建议将凭据放在源代码 #2 中

对于选项 #3,不安全的是将您的凭据作为 URL 的一部分传递,例如https://username:password@user.cloudant.com,但通过https 传递Authorization标头中的用户名和密码是安全的。这是因为即使您使用安全传输 https,URI/URL 中的所有内容都未加密,任何人都可以看到该值,但在正文或标头中传递秘密是标准做法,因为这是在建立安全连接后传输。

然后,您创建在 OpenWhisk 操作中使用凭证作为参数的操作,以便为您的后端构建业务逻辑。

那么如何从浏览器访问此后端,OpenWhisk 有一个实验性的 API 网关功能,允许您将您的操作公开为启用 CORS 的公共 API。

只有一个 url 是公开的,您的凭据作为默认参数永远不会公开。

如果您想查看有关查看 Raymond Camden 博客文章的示例,他展示了 Ionic/Angular 应用程序访问他的 Cloudant 猫数据库 https://www.raymondcamden.com/2016/12/23/going-serverless-with-openwhisk

于 2017-01-06T02:26:17.330 回答