Безопасность облачного запроса от OpenWhisk
Я создаю Angular SPA с хранилищем данных Cloudant в Bluemix.
Поскольку реализация OpenMhisk в Bluemix не использует службы VCAP, я вижу 3 варианта использования OpenWhisk в качестве поставщика API для облачных запросов для моего приложения Angular:
- Следуйте схеме передачи учетных данных, как показано здесь: https://github.com/IBM-Bluemix/openwhisk-visionapp (кстати, очень интересный подход)
- Включите учетные данные, как будто я работаю локально, как показано здесь: https://github.com/IBM-Bluemix/nodejs-cloudant/blob/master/app.js
- Используйте http API, как показано здесь: https://docs.cloudant.com/api.html (что подчеркивает проблему безопасности при передаче учетных данных.
Поскольку мой сервис не предназначен для публикации (он предназначен для моего собственного приложения), я думаю, что вариант 2 - это мой выбор "наименьшего из всех зол". Я что-то пропустил? Мое мышление таково, что, будучи хрупким к изменениям, он будет наиболее безопасным, поскольку учетные данные не передаются в открытом доступе. Безсерверная инфраструктура должна быть взломана...
Заранее спасибо!
(длительно) Обновление: (заранее извиняюсь)
Я продвинулся немного дальше, но до сих пор не получил ответа - застрял в исполнении прямо сейчас.
Чтобы уточнить, моя цель состоит в том, чтобы приложение вытекало из Angular Client -> OpenWhisk -> Cloudant.
В этом простейшем случае я хочу передать параметр startTime и параметр endTime, чтобы OpenWhisk извлекал все записи в этом диапазоне времени со всеми полями и возвращал выбранные поля. В моем примере у меня есть данные землетрясения USGS в измененном формате GeoJSON.
Следуя информации из следующих статей ниже, я пришел к выводу, что могу вызывать действия командной строки 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 ответ
Я предполагаю, что вы пытаетесь получить доступ к вашей Cloudant DB напрямую из вашего углового клиентского кода из браузера.
Если вам не нужна какая-либо бизнес-логика или вы можете уйти, используя функции Cloudant (проектирование документов, представлений, сопоставление, уменьшение и т. Д.), И вы генерируете ключи Cloudant API с определенным доступом (т. Е. Запись и чтение), тогда вам не нужен сервер или бесполезная промежуточная одежда / уровень.
Но теперь давайте перейдем к реальности, большинству людей нужен этот уровень, и если вы ищете OpenWhisk, то вам повезло, это очень легко сделать.
OpenWhisk в Bluemix поддерживает учетные данные службы VCAP, но другим способом. Давайте назовем у вас Bluemix Org carlos@example.com
и пространство dev
что бы перевести в пространство имен OpenWhisk carlos@example.com_dev
Если вы добавите сервис Cloudant под пробелом dev
в Bluemix это создаст учетные данные ключа сервиса для этой учетной записи Cloudant. Эти учетные данные дают вам супер-доступ, что означает, что вы являетесь администратором.
Если вы хотите использовать эти учетные данные Cloudant в OpenWhisk, вы можете использовать автоматическое связывание, созданное с помощью пакета cloudant. Для этого с помощью OpenWhisk CLI запустите wsk package refresh
при этом будут получены учетные данные Cloudant и создан новый пакет с учетными данными, связанными в качестве параметра по умолчанию для всех действий cloudant в этом пакете. Это модифицированная версия №1 выше
Другой альтернативой является привязка учетных данных вручную к пакету или действию в качестве параметров по умолчанию, это имеет смысл, если вы не хотите использовать учетные данные администратора с расширенными возможностями и вы сгенерировали ключ Cloudant API для конкретной базы данных. Это вариант № 1 выше.
Я не рекомендовал бы помещать учетные данные в исходный код #2
Для варианта № 3 небезопасно передавать свои учетные данные как часть URL-адреса, например https://username:password@user.cloudant.com/, но передавая имя пользователя и пароль в Authorization
заголовок через https защищен. Это связано с тем, что даже если вы используете безопасный транспортный протокол https, все в URI/URL-адресе не зашифровано, и это значение может увидеть любой, но передача секретов в теле или заголовке является стандартной практикой, так как это передача после установления безопасного соединения.
Затем вы создаете действия, которые используют учетные данные в качестве параметров в ваших действиях OpenWhisk для построения вашей бизнес-логики для вашего бэкэнда.
Тогда как вам получить доступ к этому бэкэнду из браузера, хорошо, что OpenWhisk имеет функцию API Gateway в экспериментальном режиме, которая позволяет вам представлять ваши действия как общедоступные API с включенным CORS.
Предоставляется только URL-адрес, ваши учетные данные как параметры по умолчанию никогда не предоставляются.
Если вы хотите увидеть пример на постах в блоге Рэймонда Камдена, где он показывает, как приложение Ionic/Angular получает доступ к своей облачной базе данных кошек https://www.raymondcamden.com/2016/12/23/going-serverless-with-openwhisk