使用 Cloud Code、移动应用程序安全性、Node.js 和 Bluemix

一则或许对你有用的小广告

欢迎加入小哈的星球 ,你将获得:专属的项目实战 / Java 学习路线 / 一对一提问 / 学习打卡/ 赠书活动

目前,正在 星球 内带小伙伴们做第一个项目:全栈前后端分离博客项目,采用技术栈 Spring Boot + Mybatis Plus + Vue 3.x + Vite 4手把手,前端 + 后端全栈开发,从 0 到 1 讲解每个功能点开发步骤,1v1 答疑,陪伴式直到项目上线,目前已更新了 204 小节,累计 32w+ 字,讲解图:1416 张,还在持续爆肝中,后续还会上新更多项目,目标是将 Java 领域典型的项目都整上,如秒杀系统、在线商城、IM 即时通讯、权限管理等等,已有 870+ 小伙伴加入,欢迎点击围观

所以,首先,请原谅这个有点长、乱七八糟的标题。我正在从事一个新项目,该项目涉及相当多的活动部分——其中许多对我来说都是新的。一路上我遇到了一些麻烦(好吧,麻烦很多),今天早上我终于突破了,让事情开始运转了。我要非常感谢我的同事 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>

简单吧?此调用之后的任何路由都需要安全令牌才能执行。还有一部分我忘记提到了。选择要允许的身份验证类型时,您需要在仪表板中选择移动应用程序安全服务,然后单击复选框以启用它,就像我在这里所做的那样:

我希望这是有道理的——如果没有——只需在下面添加评论。