phonegap:基于 cookie 的身份验证 (PHP) 不起作用 [webview]

Posted

技术标签:

【中文标题】phonegap:基于 cookie 的身份验证 (PHP) 不起作用 [webview]【英文标题】:phonegap: cookie based authentication (PHP) not working [webview] 【发布时间】:2011-04-12 04:18:34 【问题描述】:

我正在开发一个使用 sencha touch、html5 和 phonegap 作为包装器的移动网络应用程序。

我正在使用 php 身份验证 (Cookie) 和 ajax 请求。在 safari 或 chrome 上一切正常,但在使用 phonegap (webview) 部署后,它不再工作了......

任何帮助将不胜感激:)

更多细节:

我的应用程序的所有数据都通过 ajax 请求加载到我的服务器组件“mobile.php”。 我使用基本的 PHP-Auth 来验证用户:

    AJAX 请求 [用户名、密码] -> mobile.php -> 会话建立(cookie) 身份验证成功后的所有其他请求

普通的 safari 网站和 webview 有什么区别?

【问题讨论】:

【参考方案1】:

我想通了:

您必须更改 phonegap_delegate.m 文件并将以下内容添加到 init 方法中:


- (id) init
   
    /** If you need to do any extra app-specific initialization, you can do it here
     *  -jm
     **/
    //special setting to accept cookies via ajax-request
    NSHTTPCookieStorage *cookieStorage = [NSHTTPCookieStorage 
                                          sharedHTTPCookieStorage]; 
    [cookieStorage setCookieAcceptPolicy:NSHTTPCookieAcceptPolicyAlways]; 

    return [super init];

它使 webview 能够接受来自 ajax 请求的 cookie

【讨论】:

非常感谢。自过去 2 小时以来,我一直在尝试调试此问题。 谢谢,这对我也有用。但是你能修复你的代码格式吗?使用“1010101”图标将代码表示为代码。 有人在 android 上尝试过吗? 这似乎不适用于 ios5。根据文档,NSHTTPCookieAcceptPolicyAlways 是默认的 cookie 存储策略。然而,cookie 不会在 jQuery $.getJSON 请求中存储或发送。 @Bringo 我也注意到了这一点【参考方案2】:

如果您的 Phonegap AJAX 请求没有像预期的那样触发回调,这可能是原因。

如果您收到的响应是尝试设置 cookie 而您还没有完成 Michael 的修复,那么您的 (jquery) AJAX 请求将悄然失败——无论是 success: 还是 error: 回调都会触发,尽管服务器实际上收到请求并发送响应。即使您不关心 cookie,您也必须这样做。

我希望这对某人有所帮助。

我并不关心 cookie,只是花了几个小时试图弄清楚为什么回调没有触发!

【讨论】:

【参考方案3】:

也有适用于安卓的解决方案:

安装插件https://github.com/wymsee/cordova-HTTP 以执行任意 HTTP(S) 请求。

XMLHttpRequest 替换为插件替代品(cordovaHTTP.getcordovaHTTP.post):

cordovaHTTP.post("https://example.com/login", email: 'xyz@example.com', passwd: "s3cr3t", , function(response) 
    console.log('success');
    console.log(response);
, function(response) 
    console.log('failure');
    console.log(response);
);

响应将包含状态、数据和response.headers["Set-Cookie"],可以解析名称、值、域、路径甚至 HttpOnly 标志;-)

所述cookie可以保存在LocalStorage中并在后续请求中发送(参见.get/.post方法的cordovaHTTP.setHeader()header参数)以在桌面浏览器上模拟经过身份验证的用户。

【讨论】:

【参考方案4】:

在我的实时应用中存储获取和删除 cookie 的最佳方式

在 cookie 中存储价值

window.localStorage.setItem("key", "value");

在 cookie 中获取价值

var value = window.localStorage.getItem("key");

删除 cookie 值

window.localStorage.removeItem("key");
window.localStorage.clear();

【讨论】:

澄清一下,localStorage 与 cookie 无关。它只是一种在现代浏览器上存储字符串的机制。它确实是 cookie 的一个很好的替代品,但它肯定不是 cookie 本身。

以上是关于phonegap:基于 cookie 的身份验证 (PHP) 不起作用 [webview]的主要内容,如果未能解决你的问题,请参考以下文章

使用 jquery 在 phonegap 应用程序中管理 cookie 的位置?

.NET 基于 cookie 的身份验证,无需表单身份验证

基于 Cookie 的身份验证

基于 Cookie 的身份验证和 Web API

如何使用基于 cookie 的身份验证授权 Web API

保持 React 基于 Cookie 的身份验证状态