将Android应用程序连接到CakePhp网站

4
有没有可能让Android应用程序与cakePhp网站进行通信并共享数据?如果可能的话,我想创建一个可以登录到该网站的应用程序;我的疑问是:
  1. 如何将用户名和密码从我们的应用程序传递到cakephp网站的登录页面?有人能给我展示一个示例程序吗?

  2. cakephp控制器如何处理此请求并响应此请求?请给我展示一个示例程序。

(我是Android和cakephp的初学者。)

1
也许这个链接可以帮到你:http://stackoverflow.com/questions/9551873/cakephp-2-0-and-mobile-application-authentication如果不行,请告诉我。 - shoriwa-shaun-benjamin
3个回答

7

快速回答--是的!

我们刚刚完成了将一个能够实现这一功能的Android应用程序推向市场。以下是我们的操作步骤:

1)在Eclipse中下载并学习使用Cordova PhoneGap(2.2.0是最新版本)。这样,只需要一些HTML和大量的Javascript就可以轻松完成整个过程。

2)在您的JS中,创建推送登录信息的方法,使用AJAX参数。例如:

document.addEventListener('deviceready', onDeviceReady, false);

function onDeviceReady() {

    $("#login").click(function() {
        $email = $("#UserEmail").val();
        $pass = $("#UserPassword").val();
            $.ajax({
                    url : yourURL + 'api/users/login',
                    async : false,
                    data : {
                        'email' : $email,
                        'password' : $pass
                    },
                    dataType : 'json',
                    type : 'post',
                    success : function(result) {
                            /**
                             * do your login redirects or 
                             * use localStorage to store your data 
                             * on the phone. Keep in mind the limitations of 
                             * per domain localStorage of 5MB
                             */
                            // you are officially "logged in"
                            window.location.href = "yourUrl.html";
                            return;
                    },
                    error : function(xhr, status, err) {
                        // do your stuff when the login fails
                    }
            });
    }
}

3) 在Cake/PHP中,你的用户控制器将接受AJAX调用中的用户名和密码数据,并将其用于认证。

<?php

class UsersController extends AppController {

    public $name = 'Users';

    public function beforeFilter() {
        parent::beforeFilter();
        $this->Auth->allow('api_login');
    }

    public function api_login() {
        $this->autoRender = false;

        if ($this->request->data && isset($this->request->data['email']) && isset($this->request->data['password'])) {

            $arrUser  = $this->User->find('all',array(
                    'conditions'=>array(
                            'email'=> $this->request->data['email'],
                            'password' => $this->Auth->password($this->request->data['password']),
                    )
                )
            );

            if (count($arrUser) > 0) {
                $this->Session->write('Auth.User',$arrUser[0]['User']);

                // Do your login functions

                $arrReturn['status'] = 'SUCCESS';
                $arrReturn['data'] = array( 'loginSuccess' => 1,'user_id' => $arrUser[0]['User']['id'] );

            } else {
                $arrReturn['status'] = 'NOTLOGGEDIN';
                $arrReturn['data'] = array( 'loginSuccess' => 0 );
            }
        } else {
            $arrReturn['status'] = 'NOTLOGGEDIN';
            $arrReturn['data'] = array( 'loginSuccess' => 0 );
        }
        echo json_encode($arrReturn);
    }
}
?>

就是这些了。您现在已经通过CakePHP进行了身份验证。

您不需要使用“api_”,可以使用任何函数名称,但这有助于我们掌握允许移动用户执行的操作与 Web 用户的区别。

现在,这些只是基础构件。您基本上必须使用 HTML 和 Javascript 在手机上创建整个站点版本,因此,根据您的应用程序,更容易的方法可能只是创建响应式设计来允许移动浏览。

希望对您有所帮助!


你能给我传递用户名和密码到cakephp的安卓代码吗?还有从cakephp控制器检索一些数据到安卓应用的代码。 - Sibin Francis
Android代码就是上面列出的Javascript。你需要创建一个HTML文件,其中包含两个输入框,一个带有id UserEmail,另一个带有id UserPassword。虽然我很乐意帮助你,但我不会为你编写代码。从Cake传递数据的代码在AJAX响应中。 - J.R.
据我所知,在没有推送服务的情况下,您不能从Cake网站直接向手机(Android或iPhone)发送信息。如果您想要将数据推送到您的手机上,必须由Android应用程序请求。JSON是客户端的,所以如果您想使用REST,您需要使用新的HTML文件来完成您正在尝试做的事情,并让JSON执行重定向。 - J.R.
我尝试使用相同的方法从数据库获取数据并将其发送到我的cordova应用程序。但是在响应json中,底部附加了一些HTML..这正常吗? - Kasun Kodagoda
1
@Kasun - 通常不会出现这种情况。要么是你的布局正在被渲染(你错过了 $this->autoRender = false),要么你需要使用 $this->layout = 'ajax' 来适当地设置布局。 - J.R.
显示剩余2条评论

2

使用Admad JWT Auth插件

如果您使用的是CakePHP3,请将登录函数更改为以下内容:

public function token() {

        $user = $this->Auth->identify();


        if (!$user) {

            throw new UnauthorizedException('Invalid username (email) or password');
        }

        $this->set([
            'success' => true,
            'data' => [
                'token' => JWT::encode([
                    'sub' => $user['id'],
                    'exp' =>  time() + 604800
                ],
                Security::salt())
            ],
            '_serialize' => ['success', 'data']
        ]);
}

您可以阅读这个关于REST API和JWT认证实现的教程。 http://www.bravo-kernel.com/2015/04/how-to-add-jwt-authentication-to-a-cakephp-3-rest-api/

-1
如果将CakePHP中的大多数视图页面重建为Ajax,似乎会违背使用CakePHP的初衷。

这并不试图回答问题。 - Jerrad

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接