我正在构建一个内置在 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'));
}
如前所述,我可以beforeFilter
通过不将方法名称传递到$this->Auth->allow()
. 所以我假设我需要在 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 的帖子的评论。如果您未通过身份验证,您将获得以下内容:
{"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 登录形式。