从CakePHP处理PhoneGap应用程序的身份验证

Cam*_*ron 10 api jquery cakephp cordova

我正在构建一个内置在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]);
        }
    }
});
Run Code Online (Sandbox Code Playgroud)

这很好,返回的数据可以在我的PhoneGap应用程序中使用.但是,假设帖子列表要求您登录...

我该怎么处理?因为与重定向到登录表单的普通身份验证请求不同,在我的JSON世界中,这不会发生.实际上会发生什么是返回实际的HTML登录表单然后导致错误,因为我的JavaScript期望JSON而不是HTML.

是否有处理此问题的最佳做法,例如,如果要求身份验证,则在PhoneGap应用程序中加载登录表单视图,而不是从应用程序返回HTML登录表单,因为它正在进行此操作?也许通过JSON发送auth请求?

举个例子,一个简单的JSONized方法如下:

public function index() {
    $this->set('posts', $this->paginate());
    $this->set('_serialize', array('posts'));
}
Run Code Online (Sandbox Code Playgroud)

并且如前所述,我可以beforeFilter通过将方法名称传递给我来保护此方法$this->Auth->allow().所以我假设我需要在beforeFilter中做一些聪明的事情才能知道请求是否是JSON,如果是,那么检查方法是否需要授权然后如果是这样的话要么发回错误(而不是像HTML那样的HTML表单)通过JSON中的AuthComponent)或允许访问.

更新:2012年1月13日

在对这个主题进行了一些研究之后,我看了一下Forrst API,因为它们似乎已经有效地构建了我想要用RESTful API构建的东西.

例如,他们有一个如下调用:https://forrst.com/api/v2/post/comments?tiny_id = HUD这基本上是说显示带有微小ID的HUD的帖子的评论.如果您未经过身份验证,您将获得以下内容:

{"resp":{"error":"this method requires authentication"},"stat":"fail","in":0.0903,"authed":false,"authed_as":false,"env":"prod"}
Run Code Online (Sandbox Code Playgroud)

现在有趣的部分是即使我登录Forrst我仍然会收到该错误消息,因为它没有查看我的会话,而是期望某种令牌来验证实际请求.例如?access_token=550e8400-e29b-41d4-a716-446655440000

所以我想这里的主要问题是如何将其构建到我的Cake App中?计划如下:

在我的应用程序中,无论您是通过AJAX还是在浏览器中请求,它都会将您重定向到登录页面.Forrst处理它们并且在调用它的API时总是返回JSON错误并且不会返回HTML!这是我想在实现中实现的目标.我已将access_token列添加到我的users表中(出于安全原因,每当有人更新其密码时,该表都会更改).下一步是A)检查受保护方法的访问令牌,如果正确则允许或拒绝,然后B)当没有令牌存在或不正确并且发送正确的错误状态而不是HTML登录时我需要处理形成.

Ela*_*hts 1

jQuery ajax() 函数使您能够使用用户名:和密码:(http://api.jquery.com/jQuery.ajax/)传递登录信息以及请求,使用这些信息并处理身份验证失败错误: