我正在Bluemix上使用Cloudant数据存储建立一个Angular SPA。
由于OpenWhisk的Bluemix实现不使用VCAP服务,我看到有3个选项可以使用OpenWhisk作为我的Angi应用程序的云端查询的api提供程序:
由于我的服务不是为了发布(它适用于我自己的应用程序),我认为选项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引用的文章
我忽略了什么吗?
谢谢!
答案 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