我正在构建一个内置在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 – 从CakePHP处理PhoneGap应用程序的身份验证的更多相关文章

  1. 基于JavaScript编写一个图片转PDF转换器

    本文为大家介绍了一个简单的 JavaScript 项目,可以将图片转换为 PDF 文件。你可以从本地选择任何一张图片,只需点击一下即可将其转换为 PDF 文件,感兴趣的可以动手尝试一下

  2. jquery点赞功能实现代码 点个赞吧!

    点赞功能很多地方都会出现,如何实现爱心点赞功能,这篇文章主要为大家详细介绍了jquery点赞功能实现代码,具有一定的参考价值,感兴趣的小伙伴们可以参考一下

  3. HTML5数字输入仅接受整数的实现代码

    这篇文章主要介绍了HTML5数字输入仅接受整数的实现代码,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下

  4. amaze ui 的使用详细教程

    这篇文章主要介绍了amaze ui 的使用详细教程,本文通过多种方法给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下

  5. html5简介_动力节点Java学院整理

    这篇文章主要介绍了html5简介,用于指定构建网页的元素,这些元素中的大多数都用于描述网页内容,有兴趣的可以了解一下

  6. ios – 如何将PhoneGap调试控制台与CLI集成?

    我需要在config.xml中添加任何内容吗?

  7. 如何在iOS上使用PhoneGap从照片库中获取图片?

    我正在使用以下代码尝试从iOS照片库中选择一张照片:我在iPhone5s和PhoneGap3.3.0上使用iOS7.无论我做什么,总是带上相机.我究竟做错了什么?解决方法想想我找到了:应该:sourceType中有一个拼写错误.也许就是这样吗?

  8. PhoneGap / iOS上的SQLite数据库 – 超过5mb可能

    我误解了什么吗?Phonegap中的sqlitedbs真的有5mb的限制吗?我正在使用Phonegap1.2和iOS5.解决方法您可以使用带有phonegap插件的原生sqliteDB,您将没有任何限制.在iOS5.1中,Websql被认为是可以随时删除的临时数据…

  9. ios – 如何在使用PhoneGap构建的iPhone应用程序中使用Google Web Font?

    我们希望在为iOS设备构建的PhoneGap应用程序中使用GoogleWebFonts,但我们希望在应用程序包中托管字体文件,而不是使用代码通过Web动态获取字体.如果设备处于脱机状态,除非将字体文件捆绑到应用程序中,否则字体将不可用.谷歌提供下载网络字体的能力,但我们如何引用HTML应用程序内的本地字体文件?解决方法我们将字体文件放在.ttf格式的某个地方的assets/www文件夹中.宣言:然后像这样使用它:

  10. ios 8 Homescreen webapp,关闭和打开iPad停止javascript

    我有一个适用于iPad的全屏HTML5网络应用程序,并且刚刚安装了IOS8来试用它,它一切正常,直到你关闭并重新启动iPad.一旦web应用程序重新启动javascript就会停止并加载新页面不会重新启动它.在iPad上的Safari中打开同一页面时,关闭和打开iPad会继续按预期工作.其他人注意到了这个或想出了一个解决方案吗?解决方法这似乎是我在iOS8.1.1更新中解决的.

随机推荐

  1. jquery-plugins – 是否可以使用猫头鹰旋转木马实现循环/无限轮播?

    我正在使用猫头鹰旋转木马,它的工作完美,除了它不支持循环/无限滚动.我没有搜索google和stackoverflow的想法,没有运气.有没有人在猫头鹰旋转木马上实现圆形/无限滚动?

  2. jQuery动态输入字段焦点

    我想使用以下jQuery向我的页面动态添加一个输入字段:在这样做之后,我希望输入字段具有闪烁的文本光标的焦点,所以我想在创建后立即输入.有人可以告诉我我该怎么办?

  3. jquery – 为什么$(window).height()这样错了?

    我试图获取当前浏览器的视口高度,使用但我得到的价值观太低了.当视口高度高达850px时,我从height()获取大约350或400像素的值.这是怎么回事?

  4. jquery – 如果在此div之外和其他draggables内部(使用无效和有效的还原选项),则可拖动恢复

    例如这样但是由于明显的原因,这不行.我可以说这个吗?

  5. 创建一个jQueryUI 1.8按钮菜单

    现在jQueryUI1.8已经出来了,我正在浏览更新,并且遇到了新的Buttonwidget,特别是SplitButtonwithadropdown的演示之一.这个演示似乎表明Buttonwidget可以在这里创建一个下拉菜单.作为讨论的问题,我想知道使用这个新的Button小部件来创建一个下拉菜单有什么方法.干杯.解决方法您必须在按钮下方列出一个列表,方式类似于此处为自动完成提供的演示:http

  6. 灰色divs使用JQuery

    我试图使用这个代码:为了淡出一大堆名为MySelectorDiv的div,唯一的是,它只会淡出第一个而不是所有的div,为什么呢?

  7. 使用jQuery动态插入到列表中

    我有两个订单列表在彼此旁边.当我从一个列表中选出一个节点时,我想按照字母顺序插入到另一个列表中.抓住的是我想要把一个元素放在另一个列表中,而不刷新整个列表.奇怪的是,当我插入到右边的列表中,它工作正常,但是当我插入到左边的列表中时,顺序永远不会出来.我也尝试将所有内容读入数组,并将其排序在一起,以防止children()方法没有按照显示顺序返回任何东西,但是我仍然得到相同的结果.这是我的jQuer

  8. 没有回应MediaWiki API使用jQuery

    我试图从维基百科获取一些内容作为JSON:但我没有回应.如果我粘贴到浏览器的地址栏,就像我得到预期的内容.怎么了?解决方法您需要通过添加&callback=?来触发具有$.getJSON()的JSONP行为?在querystring上,像这样:Youcantestithere.没有使用JSONP,你正在击中same-originpolicy,阻止XmlHttpRequest获取任何数据.

  9. jQuery Ajax请求每30秒

    我有这段代码,但是有些人在我的网站上的值可能会改变.我需要每30秒钟更新一次#financediv.这可以做吗解决方法您可以将代码放在单独的函数中,如下所示:然后每30秒建立一个定时器调用该函数:祝你好运!总结以上是DEVMAX为你收集整理的jQueryAjax请求每30秒全部内容。如果觉得DEVMAX网站内容还不错,欢迎将DEVMAX网站推荐给好友。

  10. jquery – keypress事件在IE和Chrome中不工作,但在FF工作

    任何想法为什么会这样发生?我通常认为Chrome会更加宽容代码?这是我的按键键.我错过了什么吗?右图();和leftimage();是应该工作的功能,因为我在其他地方使用这些功能谢谢您的帮助!

返回
顶部