5

我有这个具有以下结构的应用程序 在此处输入图像描述

我正在使用rest 客户端库 https://github.com/philsturgeon/codeigniter-restclient 连接到MyAPI并使用php api 客户端 http://code.google.com/p/google-api-php-client/进行连接到谷歌 API

我的控制器代码如下

 function index()
    {
        if($this->form_validation->run())
        {
           $logged = $this->rest->get('auth/user',array(
               'email'=>$this->input->post('email')
                   )); 
           var_dump($logged);
        }
        $this->load->view('layout/login',$this->data);
    }

我处理此请求的 API 代码如下,它确保用户存在于我的数据库中并通过 Google 进行身份验证

function user_get()
    {
        $response=NULL;
        $data=array(
            'email'=>$this->get('email')
        );
        $google_account=$this->google->authenticate();
        if(  isset($google_account) && $this->user_model->login($data))
        {
            $response->status='success';
            $response->message=$google_account;
        }
        else
        {
            $response->status='error';
            $response->message='Failed to authenticate user';   
        }
        $this->response($response,200);
    }

Google函数“Authenticate”如下

function authenticate()
    {
        $oauth2 = new Google_Oauth2Service($this->client);
        if (isset($_GET['code']))
        {
            $this->client->authenticate($_GET['code']);
            $_SESSION['token'] = $this->client->getAccessToken();
            $redirect = 'http://' . $_SERVER['HTTP_HOST'] . $_SERVER['PHP_SELF'];
            header('Location: ' . filter_var($redirect, FILTER_SANITIZE_URL));
            return;
        }
        if (isset($_SESSION['token'])) 
        {
            $this->client->setAccessToken($_SESSION['token']);
        }
        if (isset($_REQUEST['logout'])) 
        {
            unset($_SESSION['token']);
            $this->client->revokeToken();
        }
        if ($this->client->getAccessToken()) 
        {
            $user = $oauth2->userinfo->get();
            // The access token may have been updated lazily.
            $_SESSION['token'] = $this->client->getAccessToken();
            return $user;
        } 
        else 
        {
            $authUrl = $this->client->createAuthUrl();
            redirect($authUrl);
        }

    }

问题是 当我通过直接 url 连接这个浏览器时, http://localhost/hac_dc/api/auth/user/ahmed.samy.cs@gmail.com 我得到了完美的 JSON 响应

但是当我使用休息客户端连接它时

我得到响应false我尝试改变我使用我的休息客户端的方式我尝试添加第三个参数JSON作为 MIMEapplication/json但没有成功

我不知道通过我的 REST API 连接另一个 REST API 是否有问题或不好的做法,

拉了我几个小时的头发,请帮帮我

4

2 回答 2

5

您的 REST 客户端不处理 oauth 身份验证,是吗?我假设你应该以某种方式验证你的 REST 客户端,让它使用谷歌提供的访问令牌。

要手动执行此操作,您可以在手动访问 API 时(例如使用浏览器并检查浏览器会话)将您从 Google 收到的访问令牌保存到数据存储区。有了这个可用的访问令牌,您就可以为您的 REST 客户端恢复一个有效的会话。

向 Google 验证您的 REST 客户端,可以使用 cURL 或重用一些现有的库来完成,例如https://github.com/philsturgeon/codeigniter-oauth2.git。要向您自己的 API 验证您的 REST 客户端,您可以在向您的 api 添加身份验证额外层(如果缺少)之后使用 HTTP 基本/摘要身份验证(如 CodeIgniter-REST 客户端所建议)。

PS 在验证您的用户时,如果失败,401 响应状态代码可能更合法(另请参阅http://www.w3.org/Protocols/rfc2616/rfc2616-sec10.html#sec10.4.2

于 2013-04-10T06:28:32.877 回答
0

问题是跨域请求错误。你可以连接

localhost/hac_dc/api/auth/user/ahmed.samy.cs@gmail.com

因为您的服务器充当 Web 代理。但是您不能使用简单的 getJSON 技术直接通过 REST 来完成。您可以在 jquery ajax 中使用 JSONP,它 100% 适用于跨域。JSONP 不是 JSON,它返回 js 函数调用到带有 JSON 参数的回调方法。您可以在下面的 ajax 调用中实现。但是 JSONP 中没有“成功”回调,为此您必须在 ajax 调用中提供回调参数并定义该回调函数。

$.ajax({
       crossDomain: true,
       type:"GET",
       contentType: "text; charset=utf-8",
       url: YOUR_URL + "&callback=mycallback",
        jsonp:'jsonp',
       dataType: "jsonp"
       });
function mycallback(result){
    //your callback operation
}
于 2014-03-20T06:19:07.773 回答