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

前端之家收集整理的这篇文章主要介绍了jquery – 从CakePHP处理PhoneGap应用程序的身份验证前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
我正在构建一个内置在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发送auth请求?

例如,一个简单的JSONize方法看起来像:

public function index() {
    $this->set('posts',$this->paginate());
    $this->set('_serialize',array('posts'));
}

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

更新: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"}

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

所以我猜这个主要的问题是,我该如何将它建立在我的蛋糕应用程序中?计划如下:

在我的应用程序中,无论您是通过AJAX还是通过浏览器请求,都会将您重定向登录页面. Forrst处理两者,ALWAYS在调用API时返回JSON错误,并且不会返回HTML!这是我在实现中要实现的.我已经向我的用户添加了一个access_token列(出于安全考虑,任何人更新密码时都会更改).下一步是A)检查受保护方法的此访问令牌,并允许或拒绝是否正确,然后B)当不存在令牌或不正确并且发送正确的错误状态而不是HTML登录时,我需要某种处理形成.

解决方法

我们的应用程序也有同样的问题,内置在Phonegap(现在称为Cordova).让身份验证工作真是痛苦,但最终我们设法通过使用Facebook API来实现身份验证,但我认为您不想使用Facebook.

所以,你可以做的只是通过运行以下代码来检查它是否是一个XMLHttpRequest:

PostsController – index()

if ($this->RequestHandler->isAjax() == 1){
    // This is an Ajax call
    $this->layout = 'json';
    $this->set('data',array('data','to','parse'));
} else {
    // This is the normal request
    # do the stuff you want to do here as usual
}

但是,由于这将要求您登录,因为它不在$this-> Auth-> allow()列表中,除非您登录,否则将不会访问,所以您需要做的是创建一个新的处理第一个请求的AjaxController.简单地把上面的代码放在beforeFilter中,从那里做你的魔法.从那里你可以简单地检查一个人是否登录,以及该用户的当前状态.如果他已经登录,并且要返回数据.您可以使用requestAction(‘/ path / to / what / i / need))调用所需的模型或调用控制器函数,其中您可以在Ajax调用中发送的后置变量中声明所需的路径.

在ajax布局中,您可以告诉json_encode $data,然后将正确解析.

应用

现在在您的JavaScript中,您将获得一些数据.假设您使用以下键来构建返回的JSON字符串:状态和数据.

我们假设状态已经被设置为返回的JSON中的auth,你知道你需要进行身份验证,所以你可以显示一个登录表单,然后处理所有的东西.只需在应用程序中创建一个很好的登录视图,就可以控制它的各个方面,并希望使其更安全.

如果状态设置为成功,则可以相应地显示所有帖子.

我有另一个主题的答案,我将展示我们如何创建我们自己的API,也许可以通过某种方式帮助您:https://stackoverflow.com/a/11422866/1110760

警告JavaScript似乎在Phonegap应用程序中是安全的,但不是!任何人都可以从Android设备下载.apk文件,并在Android模拟器中打开它,然后可以查看所有JavaScript和HTML代码.所以要非常小心,您将直接编入JavaScript中的数据以及API的访问方式.

我知道我的答案有点模糊,所以如果你需要关于这个答案的其他信息,请问!

猜你在找的jQuery相关文章