所以,首先,请原谅这个有点长、乱七八糟的标题。我正在从事一个新项目,该项目涉及相当多的活动部分——其中许多对我来说都是新的。一路上我遇到了一些麻烦(好吧,麻烦很多),今天早上我终于突破了,让事情开始运转了。我要非常感谢我的同事 david cariello 帮助我并且对我没有失去耐心。
我的应用程序是一个混合移动应用程序,它使用在 bluemix 上运行的 node.js 应用程序。我的 node.js 应用程序将使用 cloudant 进行数据存储,这就是问题所在。我想利用在 bluemix 上运行的 node.js 的一个特定功能,即 移动应用程序安全性 (mas)。
mas 为锁定服务器应用程序中的资源提供了一个基本框架。文档似乎暗示它只适用于移动数据和推送服务,我都没有使用。事实证明,您还可以在 node.js 应用程序中保护临时路由。很棒的是它不是一个全有或全无的解决方案。您可以打开一些路线,关闭一些路线,具体取决于您的应用程序需要什么。那你怎么用这个?
让我们从客户端开始。您可以 在此处 找到有关使用 bluemix 服务的所有文档。它首先要求您使用 Bower 添加核心库:
bower install https://hub.jazz.net/git/bluemixmobilesdk/ibmbluemix-javascript/.git
然后你必须添加你将使用的库。我已经说过我没有使用移动应用程序数据和推送。我将使用另一个功能, 云代码 。您可以将云代码视为与您的 node.js 应用程序“对话”的快速方式。所以虽然通常你可能会这样做:
$.get("the location of my server/my route", etc etc
云代码将其简化为如下所示的调用:
cc.get("/my route")
所以不是 很大的 节省,但是你可以自动为你的调用添加安全性,并在开发和生产之间切换。总而言之,这是一个不错的图书馆。你也可以用 bower 添加它:
bower install https://hub.jazz.net/git/bluemixmobilesdk/ibmcloudcode-javascript/.git
一旦你安装了这两个库,只需在你的代码中解决它们:
<script src="lib/ibmbluemix/js/ibmbluemix.js"></script>
<script src='lib/ibmcloudcode/js/ibmcloudcode.js'></script>
好的,现在是使用 cc 的问题。如果您没有使用安全性,或者您想要运行不安全的路由,则代码如下所示:
<script src="lib/ibmbluemix/js/ibmbluemix.js"></script>
<script src='lib/ibmcloudcode/js/ibmcloudcode.js'></script>
初始块配置您对 bluemix 的使用。单击 bluemix 应用仪表板上的移动选项链接可以找到所有三个值:
您显然可以保留实例变量。此外,您还可以获得每种 http 类型的方法,因此 cc.post、cc.delete 等在测试期间当您的 node.js 应用程序在本地运行时,您可以切换到访问本地实例:
<script src="lib/ibmbluemix/js/ibmbluemix.js"></script>
<script src='lib/ibmcloudcode/js/ibmcloudcode.js'></script>
那是调用不安全的路由,但是你想要锁定的路由呢?移动应用程序安全支持两种类型的身份验证——google 和 worklight。谷歌将更容易在我的移动应用程序中使用,所以我选择了它。要使用 google,您需要使用 oauth 来登录客户端。nic raboy 有一个 非常简单的 cordova 插件, ng-cordova-oauth 。他的库支持大量不同的 oauth 提供商,包括谷歌。添加谷歌身份验证到我的应用程序,我添加了他的插件,然后使用这个简单的代码。请注意,我 没有 将身份验证的结果存储在此代码块中。那是我稍后会添加的内容。
<script src="lib/ibmbluemix/js/ibmbluemix.js"></script>
<script src='lib/ibmcloudcode/js/ibmcloudcode.js'></script>
前面的那个大价值是我的谷歌项目客户 ID。信不信由你——这就是全部代码。该插件处理弹出窗口并运行整个 oauth 流程:
oauth 完成后,我们可以使用该进程返回的访问令牌来“签署”我们对云代码的调用:
<script src="lib/ibmbluemix/js/ibmbluemix.js"></script>
<script src='lib/ibmcloudcode/js/ibmcloudcode.js'></script>
现在每当我使用云代码调用时,它们都会将令牌值传递给 node.js 应用程序。
这就是客户端代码。显然还有很多细节,当我得到我正在构建的应用程序准备 好 分享时,我将分享完整的代码库。现在让我们把注意力转向服务器端。
node.js 将需要两个不同的包——第一个是通用的 bluemix 库,然后是安全包。您可以通过执行以下操作将两者安装到您的 package.json 中:
npm install ibmbluemix --save
npm install ibmsecurity --save
然后在启动时配置您的应用程序。这是样板文件中的一个示例:
<script src="lib/ibmbluemix/js/ibmbluemix.js"></script>
<script src='lib/ibmcloudcode/js/ibmcloudcode.js'></script>
现在——让我们讨论一下我之前提到的使用云代码的路由。在第一个示例中,您看到我运行了一条名为
/allfree
的路线。为了让云代码访问此路由,您
必须
修改路由路径以包含 ibm bluemix 上下文根。这很简单:
<script src="lib/ibmbluemix/js/ibmbluemix.js"></script>
<script src='lib/ibmcloudcode/js/ibmcloudcode.js'></script>
如果您忘记了这一点,那么您将在从您的移动应用程序运行云代码调用时遇到错误。需要明确的是,对 /allfree 的常规 http 调用是可行的,但使用云代码的“包装”调用无效。
所以下一个问题是——如何为路由启用安全性?为此,您首先需要将需要安全的路线与不需要的路线进行物理隔离。您的核心 app.js(或您用来运行 node.js 应用程序的任何文件)应该首先放置不安全的路由,然后使用此块开始要求安全调用:
<script src="lib/ibmbluemix/js/ibmbluemix.js"></script>
<script src='lib/ibmcloudcode/js/ibmcloudcode.js'></script>
简单吧?此调用之后的任何路由都需要安全令牌才能执行。还有一部分我忘记提到了。选择要允许的身份验证类型时,您需要在仪表板中选择移动应用程序安全服务,然后单击复选框以启用它,就像我在这里所做的那样:
我希望这是有道理的——如果没有——只需在下面添加评论。