5

私は以下の構造を持つこのアプリケーションを持っています ここに画像の説明を入力

レスト クライアント ライブラリ https://github.com/philsturgeon/codeigniter-restclientを使用してMyAPI に接続し、 php API クライアント http://code.google.com/p/google-api-php-client/を使用して接続していますGoogle 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);
        }

    }

問題は 、このThroughtブラウザを直接URLに接続すると、 http://localhost/hac_dc/api/auth/user/ahmed.samy.cs@gmail.com JSON応答が完全に得られることです

しかし、残りのクライアントを使用して接続すると

私は応答を受け取りfalseました。残りのクライアントの使用方法を変更しようとしました。第 3 パラメーターを MIME としてJSON、および MIMEとして追加しようとしましapplication/jsonたが、うまくいきませんでした。

私のREST APIを介して別のREST APIを接続することが問題なのか悪い習慣なのかはわかりませんが、

何時間も髪を引っ張っていたので助けてください

4

2 に答える 2

5

REST クライアントは oauth 認証を処理しませんね。REST クライアントを何らかの形で認証して、Google から提供されたアクセス トークンを使用できるようにする必要があると思います。

手動でこれを行うには、API に手動でアクセスするときに、Google から受け取ったアクセス トークンをデータストアに保存します (たとえば、ブラウザーを使用して、ブラウザー セッションを調べます)。このアクセス トークンを使用できるようにすると、REST クライアントの有効なセッションを復元できます。

Google に対する REST クライアントの認証は、cURL を使用するか、https://github.com/philsturgeon/codeigniter-oauth2.gitなどの既存のライブラリを再利用して実行できます。独自の API に対して REST クライアントを認証するには、API に認証の追加レイヤーを追加した後 (CodeIgniter-REST クライアントで提案されているように)、HTTP 基本/ダイジェスト認証を使用できます (欠落している場合)。

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 ではありません。JSON パラメータを使用してコールバック メソッドへの js 関数呼び出しを返します。次の 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 に答える