1

Drupal ページ内からホストされる Flash アプリケーションがあります。Flash アプリケーションの一部はすべてのユーザーが使用できるようにする必要がありますが、一部はログイン ユーザーのみが使用できるようにする必要があります。(特定の役割は関係ありません。サイトの承認されたユーザーであるというだけです)。

Flash 内から、「?q=user」ページをスクリーン スクレイピングすることで、ユーザーがログオンしているかどうかを検出できますが、これは非常に脆弱です。これを行う「正しい」方法は何ですか?必要に応じて追加のモジュールをインストールできますが、Drupal 5 ではなく 6 と互換性がある必要があります。

同様に、現在ログインしているユーザーがいない場合、提供されたユーザー名とパスワードを取得してログインするにはどうすればよいですか (またはパスワードが間違っていると判断できますか)。

4

3 に答える 3

4

「正しい」解決策

おそらく、サービスモジュールのようなものを見たいと思うでしょう。基本的に、ユーザーサービスをフラッシュアプ​​リに公開する必要があるため、リクエストを送信して(XML-RPCまたは選択した実装を介して)、「現在ログインしているユーザーのアクセス権」や「このユーザーにログインする」などの情報を取得できます。ユーザー名xとパスワードy"など。

自分ですぐに解決する

モジュール開発に精通している場合は、「実際の」Webサービス層を経由せずに、必要な機能を取得するために独自のモジュールをすばやく作成できます。「myservices」というモジュールを作成する簡単な例を次に示します。

<?php
// myservices.info
   name = My Services
   description = Expose basic services
   core = 6.x

<?php
// myservices.module

   function myservices_menu() {
       $items['myservices/user'] = array(
         'title' => 'Get auth',
         'page callback' => 'myservices_get_user',
         'access arguments' => array('access content'),
       );
       return $items;
   }

   function myservices_get_user() {
       global $user;
       if (in_array('authenticated user', $user->roles) ) {
           print 'yes';
       } else {
           print 'no';
       }
   }

これらの2つのファイルをモジュールディレクトリの「myservices」ディレクトリに配置し、アクティブ化してから、に移動します。http://yourdomain.com/myservices/user

認証されている場合は返されますが、認証されてyesいない場合はno、フラッシュアプ​​リで取得できます。

于 2008-11-11T23:10:49.960 に答える
2

Drupal の「システム」サービスと「ユーザー」サービスを使用してこれを行うことができました。

  • サービス モジュールをインストールする
  • 「システム」および「ユーザー」サービスを有効にする
  • 以下のコードでは、API キーを無効にします。(または、それらを有効のままにして、追加の引数を指定します)
  • サービスにアクセスするための認証済みユーザーと匿名ユーザーの両方の許可

これを書いている時点では、AMFPHP サービスはまだ Drupal 6 に移植されていないため、XMLRPC を使用しました。ActionScript から XMLRPC を使用するために、as3-rpclibのヘルパー ライブラリを使用しました。このライブラリは ActionScript2 用に作成されているため、Flex3 で使用するには、このページで説明されているようにパッチを適用する必要がありました(ページを下にスクロールして、2008 年 5 月 10 日の「jameshyu」によるコメントを検索してください)。

これらの前提条件がすべて満たされたら、現在ログインしているユーザー (存在する場合) を確認したり、次のようなコードを使用してユーザーをログインしたりできます。

実際にログインを実装するモジュールは次のとおりです。

package
{
    import com.ak33m.rpc.xmlrpc.XMLRPCObject;

    import flash.events.*;
    import flash.net.*;

    import mx.collections.ItemResponder;
    import mx.rpc.AsyncToken;
    import mx.rpc.events.FaultEvent;
    import mx.rpc.events.ResultEvent;


    public class DrupalLogin
    {
        private var _api:XMLRPCObject;

        public function DrupalLogin( url:String )
        {
            _api = new XMLRPCObject();
            _api.endpoint = url;
            _api.destination = "";
        }

        public function set LoginResult( fn:Function ):void {_handleLoginResult = fn; }
        public function set CheckResult( fn:Function ):void {_handleCheckResult = fn; }
        public function set LogoutResult( fn:Function ):void {_handleLogoutResult = fn; }
        public function get User():String { return _user; }
        public function set TraceResult( fn:Function ):void {_handleTrace = fn; }

        private var _handleLoginResult:Function;
        private var _handleCheckResult:Function;
        private var _handleLogoutResult:Function;
        private var _handleTrace:Function;

        private function onTrace( st:String ):void
        {
            _handleTrace(st);
        }

        private var _firstCheckDone:Boolean = false;
        private var _loggedIn:Boolean = false;


        // The logged-in user's ID (if any)
        private var _user:String = "";



        // *****************************************
        // doLogin
        // *****************************************

        // Function doLogin kicks off the process.
        public function doLogin( user:String, pwd:String ):void
        {
            onTrace( "******************* doLogin ********************" );

            if( !_firstCheckDone )
            {
                _handleLoginResult( false, "ALWAYS CALL doCheck() FIRST TO SEE IF YOU NEED TO LOG IN OR NOT" );
                return;
            }
            if( _loggedIn )
            {
                _handleLoginResult( true, "YOU ARE ALREADY LOGGED IN" );
                return;
            }

            var token:AsyncToken = _api.call( "user.login", _sid, user, pwd );
            var tresponder:ItemResponder = new ItemResponder(this.onLoginInfo,this.onLoginFault);
            token.addResponder(tresponder);
        }


        private function onLoginInfo (event:ResultEvent,token:Object = null):void
        {
            onTrace( "... got onLoginInfo" );

            _user = event.result.user.name;
            _loggedIn = true;
            _handleLoginResult( true, "logged in ok" );         
        }

        private function onLoginFault (event:FaultEvent, token:Object=null):void
        {
            onTrace( "   got onLoginFault" );

            _loggedIn = false;
            _handleLoginResult( false, "Fault: " + event.fault.faultString + " -- " + event.fault.faultCode);
        }


        // *****************************************
        // doLogout
        // *****************************************

        public function doLogout():void
        {
            onTrace( "******************* doLogout ********************" );

            if( !_firstCheckDone )
            {
                _handleLogoutResult( false, "ALWAYS CALL doCheck() FIRST TO SEE IF YOU ARE ABLE TO LOG OUT OR NOT" );
                return;
            }
            if( !_loggedIn )
            {
                _handleLogoutResult( true, "YOU ARE ALREADY LOGGED OUT" );
                return;
            }

            var token:AsyncToken = _api.call( "user.logout", _sid );
            var tresponder:ItemResponder = new ItemResponder(this.onLogoutInfo,this.onLogoutFault);
            token.addResponder(tresponder);
        }

        private function onLogoutInfo (event:ResultEvent,token:Object = null):void
        {
            onTrace( "got onLogoutInfo" );

            _loggedIn = false;
            _handleLogoutResult( true, "logged out ok" );           
        }

        private function onLogoutFault (event:FaultEvent, token:Object=null):void
        {
            onTrace( "got onLogoutFault" );

            _loggedIn = false;
            _handleLogoutResult( false, "Fault: " + event.fault.faultString + " -- " + event.fault.faultCode);
        }


        // *****************************************
        // doCheckLogin
        // *****************************************

        private var _sid:String;

        public function doCheckLogin():void
        {
            onTrace( "******************* doCheckLogin ********************" );

            var token:AsyncToken = _api.call( "system.connect" );
            var tresponder:ItemResponder = new ItemResponder(this.onCheckInfo,this.onCheckFault);
            token.addResponder(tresponder);

        }

        private function onCheckInfo (event:ResultEvent,token:Object = null):void
        {
            onTrace( "got onCheckInfo" );

            _user = event.result.user.name;
            _sid = event.result.user.sid;
            var roles:Object = event.result.user.roles;
            _loggedIn = false;
            for( var i:int=0; i<10; i++ )
            {
                var tmp:String = roles[i.toString()];
                if( tmp == "authenticated user" )
                    _loggedIn = true;
            }

            trace( "user = " + _user + ", sid=" + _sid + ", loggedIn=" + _loggedIn );
            _firstCheckDone = true;

            _handleCheckResult( _loggedIn, _loggedIn?("Currently logged in as " + _user):"Not logged in yet" );
        }

        private function onCheckFault (event:FaultEvent, token:Object=null):void
        {
            onTrace( "got onCheckFault" );

            _handleCheckResult( false, "Fault: " + event.fault.faultString + " -- " + event.fault.faultCode);
        }

    }
}

これを使用する例を次に示します。

<?xml version="1.0" encoding="utf-8"?>
<mx:Application xmlns:mx="http://www.adobe.com/2006/mxml" layout="absolute">
    <mx:Script source="LoginExample.as" />
    <mx:Button id="btnGoodLogin" click="btnGoodLogin_onClick()"  label="Good Login" enabled="true" y="28"/>
    <mx:Button id="btnBadLogin" click="btnBadLogin_onClick()"  label="Bad Login" enabled="true" y="28" x="112"/>
    <mx:Button id="btnLogout" click="btnLogout_onClick()"  label="Logout" enabled="true" y="28" x="219"/>
    <mx:Button id="btnCheck" click="btnCheck_onClick()"  label="Check" enabled="true" y="28" x="325"/>
    <mx:Text id="txtResult"  y="58" width="263"/>
</mx:Application>





import flash.events.*;
import flash.net.*;

private var _login:DrupalLogin;

private function setup():void
{
    if( _login==null )
    {
        var url:String = "http://myserver/mydrupal?q=services/xmlrpc";

        _login = new DrupalLogin(url);
        _login.CheckResult = handleCheckResult;
        _login.LoginResult = handleLoginResult;
        _login.LogoutResult = handleLogoutResult;
        _login.TraceResult = handleTraceResult;
    }
}

private function btnGoodLogin_onClick():void
{
    setup();
    _login.doLogin( "goodname", "goodpwd" );
}

private function btnBadLogin_onClick():void
{
    setup();
    _login.doLogin( "badname", "badpwd" );
}

private function btnLogout_onClick():void
{
    setup();
    _login.doLogout();
}

private function btnCheck_onClick():void
{
    setup();
    _login.doCheckLogin();
}



private function showResult( result:String):void
{
    trace( "showResult: " + result );
    txtResult.text = result;    
}

private function handleTraceResult( text:String ):void
{
    trace( text );
}



private function handleCheckResult( loggedIn:Boolean, txt:String="" ):void
{
    if( txt != "" )
        txt = " (" + txt + ")";

    if( loggedIn )
        showResult( "ALREADY LOGGED IN AS " + _login.User + txt);
    else
        showResult( "NOT LOGGED IN YET" + txt );
}

private function handleLoginResult( loggedIn:Boolean, txt:String="" ):void
{
    if( txt != "" )
        txt = " (" + txt + ")";

    if( loggedIn )
        showResult( "LOGIN ATTEMPT SUCCEEDED" + txt);
    else
        showResult( "LOGIN ATTEMPT FAILED" + txt );
}

private function handleLogoutResult( loggedOut:Boolean, txt:String="" ):void
{
    if( txt != "" )
        txt = " (" + txt + ")";

    if( loggedOut )
        showResult( "LOGOUT ATTEMPT SUCCEEDED" + txt );
    else
        showResult( "LOGOUT ATTEMPT FAILED" + txt);
}
于 2008-11-14T22:06:34.717 に答える
0

これは、この投稿が最初に作成されたときからかなり前のものであることは承知していますが、まだこれに興味があり、時間をかけてあまり調査したことがない場合は、フラッシュ ドキュメントを介してログインを正常に処理する方法を見つけました。(それに関しては、組み込みまたは外部のものです。) システムに AMFPHP をインストールする必要さえありません。(AMFPHP が依存しているサービス モジュールを最後に確認したので、これは良いことです。まだ推奨ステータスがありません。)

ここにデモ ページを設定しました: AS3 Login Demo Page

ログインとログアウトができ、すでにログインしているかどうかが検出されます。これはまだ進行中の作業ですが、必要なもののほとんどが用意されています。

ドキュメンテーションとソースのコピーが必要な場合は、ここから入手できます: www.andrewnprice.com

それが役立つことを願っています。来週中にそのデモを更新する予定なので、投稿で追加することについて言及している他の機能が必要な場合は、もう一度確認してください.

于 2009-02-26T13:26:20.303 に答える