2012-02-15 13 views
0

フレックスとcakephpを使用して開発されたWebアプリケーションがあります。私のクライアントは、Adobe AIRを使用してそのWebアプリケーションのデスクトップアプリケーションを作成する必要があります。フレックスの空気への変換は首尾よく行われます。フレックスアプリケーションとフレキシブルケーキの通信はリモコンコントローラを使って処理されます。cakephpユーザー認証Adobe AIRアプリケーション

私は、cakephpのデフォルトユーザー認証でユーザーを認証するという問題があります。誰かが私にこれのための解決策を見つけるのを助けることができますか?

+0

問題が発生すると、より具体的にしてください。これまでに何を試しましたか?たとえば、POSTリクエストを送信してJSONを取得していますか? – swiecki

+0

cakephpにはユーザログインを扱う独自のメソッドがあるので、私はそれをどのように扱うことができるのか知りたいです。 – user1120633

答えて

0

私はあなたのcakephpバックエンドにPOSTを介してあなたのユーザーの資格情報を送信することをお勧めします。

あなたがUserControllerでのログイン機能は、次のようになります

public function login() { 
    if ($this->Auth->login()) { 
    $this->serviceResponse(Status::SUCCESS); 
} else { 
    $this->serviceResponse(Status::AUTH_FAILED); 
    } 
} 

// this is just an example out of my appcontroller to send json responses 
public function serviceResponse($code, $data = array()) { 
    $response = compact('code', 'data'); 
    $this->response->body(json_encode($response)); 
    $this->response->send(); 
    $this->shutdownProcess(); 
    exit; 
} 

// I also defined a class for return statuses 
class Status { 
    const SUCCESS = 'success'; 
    const ERROR = 'error'; 
    ... 
} 
+0

'var loader:URLLoader = new URLLoader(); \t \t var req:URLRequest = new URLRequest( "http:// myurl/login"); \t \t var headerRequests:Array = new Array(1); \t \t req.method = "POST"; \t \t \t \t var headerRequests:Array = new Array(1); \t \t headerRequests [0] =新しいURLRequestHeader( "email_address = email&password = pwd"); \t \t req.requestHeaders = headerRequests; \t \tローダー。load(req); ' これはリクエストを送信するために行ったコードです。しかし、まだ認証が失敗しているようです。これは正しいです? – user1120633

+0

FlexAppを使用せずに認証が機能していますか? ここには認証が記載されています:http://book.cakephp.org/2.0/en/core-libraries/components/authentication.html –

+0

はい。 Flexアプリケーションはここには含まれません。これは純粋にAIRアプリケーションです – user1120633

0

は基本的に、あなたは、Ajaxリクエストとして検証要求を送信します。これを行うには、ヘッダーを変更し、セッションIDをCookieで取得し、セッションを有効にするためにポストする必要があります。これは、Cakeから返されたJSONオブジェクトを期待しています。

私はFlex Mobile AppとCakePHPバックエンドでこれを実現する2つのFlexクラスを作成しました。それはあなたのニーズにも同じように動作するはずです。

これは2つのファイルで、AutoValidationUrlRequest.asはHeaderURLRequest.asファイルを拡張します。私は肯定的ではありませんが、変更するには変数がいくつかあるかもしれませんが、全体的にはうまくいきますし、おそらくあなたのアプリで作業するためにいくつかの変更が必要になるでしょう。

これを使用するには、新しいAutoValidationUrlRequestオブジェクトを作成し、headerUrlRequestCompleteイベントにイベントリスナーを追加し、AutoValidationUrlRequest.send(...)をPOSTに実行するだけです。簡単なCake Friendly Post変数のためのconvertToPostVarsと呼ばれる便利なメソッドもあります。

AutoValidationUrlRequest.as:

package libs 
{ 

import flash.events.Event; 
import flash.events.EventDispatcher; 
import flash.events.HTTPStatusEvent; 

import models.LocalDeviceData; 
import models.Model; 

import mx.collections.ArrayCollection; 
import mx.core.FlexGlobals; 
import mx.utils.ObjectUtil; 

[Event("LoginFailed")] 
[Event("MobileUserDoesNotExist")] 

public class AutoValidationURLRequest extends HeaderURLRequest 
{  
    public static const LOGIN_FAILED:String = "LoginFailed"; 
    public static const MOBILE_USER_DOES_NOT_EXIST:String = "MobileUserDoesNotExist"; 
    /** 
    * will automatically be set by this class, if not set will login 
    */ 
    public var requestHeaders:Object = new Object(); 
    private var _cookie:Object; 

    /** 
    * should be an object with name of the cookie variables parsed in as key/value pairs 
    */ 
    protected function set cookie(ck:Object):void{ 
     _cookie = ck; 
    } 

    protected function get cookie():Object{ 
     return _cookie; 
    } 

    public function AutoValidationURLRequest(){ 

    }; 

    public function send(url:String, postData:Object, generateUrlVars:Boolean = true):void{ 
     if(generateUrlVars){ 
      postData = convertToPostVars(postData); 
     } 
     sendRequest("http://yourwebsite.com"+url, postData, requestHeaders); 
    } 

    override protected function parseHeaders(e:HTTPStatusEvent):void{ 
     super.parseHeaders(e); 
     if('Set-Cookie' in headers){ 
      requestHeaders['Cookie'] = parseCookie(headers['Set-Cookie']); 
      //requestHeaders['User-Agent'] = headers['User-Agent']; 
     } 
    } 


    /** 
    * returns the cookie key/val string for send requests back to the server 
    */ 
    protected function parseCookie(cookieString:String):String{ 
     var cookieObj:Object = new Object(); 
     var cookieBits:Array = cookieString.split("; "); 
     return cookieBits[0]; 

     /* 
     for each(var ck:String in cookieBits){ 
      var cb:Array = ck.split("="); 
      cookieObj[cb[0]] = cb[1]; 
     } 
     return cookieObj; 
     */ 
    } 

} 
} 

HeaderURLRequest.as:

package libs 
{ 

import flash.events.Event; 
import flash.events.EventDispatcher; 
import flash.events.HTTPStatusEvent; 
import flash.net.URLLoader; 
import flash.net.URLRequest; 
import flash.net.URLRequestHeader; 
import flash.net.URLRequestMethod; 
import flash.net.URLVariables; 

import mx.core.FlexGlobals; 
import mx.rpc.events.ResultEvent; 
import mx.utils.ObjectUtil; 


[Event("headerUrlRequestComplete")] 

public class HeaderURLRequest extends EventDispatcher 
{ 
    public static const HEADERURLREQUEST_COMPLETE:String = "headerUrlRequestComplete"; 

    public var headers:Array = []; 
    public var data:Object = new Object(); 
    public var variables:Object = new Object(); 
    public var invalidFields:Object = new Object(); 
    public var errorMsg:String = ""; 


    /** 
    * the headers array must contain an object with a 'name' key and a 'value' key eg: cookie: <cookieStr> 
    */ 
    public function HeaderURLRequest():void{ 
    } 

    public function sendRequest(url:String, postData:Object = null, requestHeaders:Object = null):void{ 
     var urlLoader:URLLoader = new URLLoader() 
     var urlRequest : URLRequest = new URLRequest(url); 

     //make it an ajax request 
     urlRequest.requestHeaders.push(new URLRequestHeader('X-Requested-With', 'XMLHttpRequest')); 

     for(var header:* in requestHeaders){ 
      var authHeader:URLRequestHeader = new URLRequestHeader(header as String, requestHeaders[header]); 
      urlRequest.requestHeaders.push(authHeader) 
     } 
     var urlVariables:URLVariables = new URLVariables(); 
     for (var vars:* in postData){ 
      urlVariables[vars] = postData[vars]; 
     } 

     urlRequest.method = URLRequestMethod.POST 
     urlRequest.data = urlVariables; 
     urlLoader.addEventListener(Event.COMPLETE, getData); 
     urlLoader.addEventListener(HTTPStatusEvent.HTTP_RESPONSE_STATUS, parseHeaders); 
     urlLoader.load(urlRequest); 

    } 

    public function convertToPostVars(postData:Object, prependKeyName:String = ""):Object{ 
     var params:Object = {}; 
     if(prependKeyName == ""){ 
      params['_method'] = 'POST'; 
     } 
     for (var item:* in postData){ 
      var objtype:Object = ObjectUtil.getClassInfo(postData[item]); 
      if(objtype.name == "Object"){ 
       var modelKeyName:String = prependKeyName+"["+item+"]"; 
       var subParams:Object = convertToPostVars(postData[item],modelKeyName); 
       params = merge(params, subParams); 
      }else{ 
       params["data"+prependKeyName+"["+item+"]"] = postData[item]; 
      } 
     } 
     return params; 
    } 

    public function flashErrorMsg():String{ 
     var err:String = errorMsg; 
     errorMsg = ""; 
     return err; 
    } 

    protected function parseHeaders(e:HTTPStatusEvent):void{ 
     var i:Number=0; 
     headers = []; 
     for each(var header:URLRequestHeader in e.responseHeaders){ 
      headers[header.name] = header.value; 
     i++; 
     } 
    } 

    protected function getData(e:Event):void{ 
     //trace('data: '); 
     if(e.currentTarget.data == ''){ 
      e.currentTarget.data = '{}'; 
     } 
     data = JSON.parse(e.currentTarget.data); 

     //trace(ObjectUtil.toString(data)); 
     if(data.hasOwnProperty('variables')){ 
      variables = data.variables; 
      if (variables != null){ 
       if(variables.hasOwnProperty('invalidFields')){ 
        invalidFields = variables.invalidFields; 
        for (var error:String in invalidFields){ 
         errorMsg += invalidFields[error] + "\n\n"; 
        } 
       } 
      }else{ 
       //no variable data found!! 
      } 
     } 
     dispatchEvent(new Event(HEADERURLREQUEST_COMPLETE)); 
    } 

    public function isEmpty(obj:Object){ 
     var isEmpty:Boolean = true; 
     for (var n in obj) { isEmpty = false; break; } 
     return isEmpty; 
    } 

    public function merge(obj0:Object, obj1:Object):Object 
    { 
     var obj:Object = { }; 
     for(var p:String in obj0) 
     { 
      obj[ p ] = (obj1[ p ] != null) ? obj1[ p ] : obj0[ p ]; 
      //trace(p, ' : obj0', obj0[ p ], 'obj1', obj1[ p ], '-> new value = ', obj[ p ]); 
     } 
     for (var p1:String in obj1){ 
      if(!obj.hasOwnProperty(p1)){ 
       obj[ p1 ] = obj1[ p1 ] ; 
      } 
     } 
     return obj; 
    } 
} 
} 

また、私のforked version of Jose Gonzalez's CakePHP ajax_controller pluginでこれを使用すると、本当に便利です。基本的にはAjaxリクエストを受け取り、すべてのビュー変数を変換し、レンダリングされていないビューとしてJSONオブジェクトに出力します。それ以外の場合、ajaxリクエストを使用していない場合、Cakeはビューを通常どおりレンダリングします。がんばろう!

関連する問題