【发布时间】:2013-01-09 11:02:55
【问题描述】:
我正在构建一个内置在 PhoneGap 中的简单应用,它使用 REST API 在服务器上从我的网站加载数据(因为您无法在 PhoneGap 中运行 PHP)。
列出一些数据的示例可能是:
$.ajax({
url: 'http://myserver.com/posts/index.json',
dataType: 'jsonp',
success: function(data) {
for (var i=0,total=data.length; i<total; i++)
{
console.log(data.Post.title[i]);
}
}
});
这很好,返回的数据可以在我的 PhoneGap 应用程序中使用。但是,假设帖子列表要求您登录...
我将如何处理这个问题?因为与重定向到登录表单的正常身份验证请求不同,在我的 JSON 世界中,这不会发生。实际上会发生 实际的 HTML 登录表单被返回,然后导致错误,因为我的 JavaScript 需要 JSON 而不是 HTML。
是否有处理此问题的最佳实践,例如,如果请求身份验证,则在 PhoneGap 应用程序中加载登录表单视图,而不是像当前那样从应用程序返回 HTML 登录表单?也许通过 JSON 发送身份验证请求?
例如,一个简单的 JSON 化方法如下所示:
public function index() {
$this->set('posts', $this->paginate());
$this->set('_serialize', array('posts'));
}
如前所述,我可以通过不将方法名称传递给$this->Auth->allow() 来保护beforeFilter 中的此方法。所以我假设我需要在 beforeFilter 中做一些聪明的事情来知道请求是否是 JSON,如果是,那么检查该方法是否需要授权,然后如果需要,要么发回错误(而不是像 Cake 通常的 HTML 表单在 JSON 中通过 AuthComponent) 或允许访问。
更新日期:2012 年 1 月 13 日
在对该主题进行了更多研究之后,我查看了 Forrst API,因为它们似乎已经有效地构建了我希望构建的 RESTful API。
例如,他们有这样的电话:https://forrst.com/api/v2/post/comments?tiny_id=HUD 这基本上是说显示带有 HUD 的小 id 的帖子的 cmets。如果您未通过身份验证,您将获得以下内容:
{"resp":{"error":"this method requires authentication"},"stat":"fail","in":0.0903,"authed":false,"authed_as":false,"env":"prod"}
现在有趣的部分是,即使我登录 Forrst,我仍然会收到该错误消息,因为它没有查看我的会话,而是期待某种令牌来验证实际请求。例如?access_token=550e8400-e29b-41d4-a716-446655440000
所以我想这里的主要问题是如何将它构建到我的 Cake App 中?计划如下:
在我的应用程序中,无论您是通过 AJAX 还是在浏览器中请求它,它都会将您重定向到登录页面。 Forrst 处理这两种情况,并且在调用它的 API 时总是返回 JSON 错误,并且永远不会返回 HTML! 这就是我想要在我的实现中实现的目标。我在我的用户表中添加了一个 access_token 列(出于安全原因,每当有人更新密码时,该列都会更改)。下一步是 A) 检查受保护方法的访问令牌,如果正确则允许或拒绝,然后 B) 当不存在令牌或不正确时,我需要某种方式进行处理,并发送正确的错误状态而不是 HTML 登录表格。
【问题讨论】:
-
如果我理解正确,您是在为 Forrst 本身构建应用程序?或者您是否使用 Forrst 作为您的用户管理系统?我确实有使用 Cordova (Phonegap) 和 CakePHP 的经验,所以我可能可以帮助你,但这个问题对我来说并不是 100% 清楚。您可以分享指向您正在使用的确切 API 的链接吗?因为我能找到关于这个 API 的唯一内容是 forrst.com/api,但它似乎是一个访问他们帖子的 API,而不是用户管理系统。所以我不明白您使用
myserver.com的第一个代码sn-p 和稍后使用的forrst.com之间的链接。 -
对不起,我只是使用 Forrst 作为我试图在 API 功能方面创建的示例。特别是返回的 JSON 的身份验证部分。 我没有使用 Forrst 的任何东西。
-
好的,看看我的回答。我希望它能以某种方式帮助你:)
标签: jquery api cakephp cordova