来自OpenWhisk

时间:2017-01-06 01:20:13

标签: ibm-cloud cloudant openwhisk

我正在Bluemix上使用Cloudant数据存储建立一个Angular SPA。

由于OpenWhisk的Bluemix实现不使用VCAP服务,我看到有3个选项可以使用OpenWhisk作为我的Angi应用程序的云端查询的api提供程序:

  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(突出显示传递凭据的安全问题。
  4. 由于我的服务不是为了发布(它适用于我自己的应用程序),我认为选项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和selector语法用法,但对于我需要构建的用于填充数据的更新函数也很有用!

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

    我忽略了什么吗?

    谢谢!

1 个答案:

答案 0 :(得分:2)

我假设你要做的是直接从浏览器的角度客户端代码访问你的Cloudant数据库。

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

但是现在让我们变得真实,大多数人都需要这个等级,如果你正在寻找一个OpenWhisk,那么你运气好,这很容易做到。

Bluemix上的OpenWhisk支持VCAP服务凭证,但方式不同。 我们的名字是你有一个Bluemix组织carlos@example.com和空格dev,它将转换为OpenWhisk名称空间carlos@example.com_dev

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

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

另一种方法是将凭证手动绑定到包或操作作为默认参数,这在您不想使用超级强力管理凭据时生成,并且您为特定数据库生成了Cloudant API密钥。这是上面的选项#1。

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

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

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

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

只有公开的网址,您的凭据作为默认参数永远不会公开。

如果你想查看一个关于退出Raymond Camden博客文章的例子,他会在那里展示Ionic / Angular App访问他的Cloudant数据库中的猫 https://www.raymondcamden.com/2016/12/23/going-serverless-with-openwhisk