как войти в систему пользователя Drupal (или войти в систему в данный момент) из Flex / Flash? - PullRequest
1 голос
/ 12 ноября 2008

У меня есть приложение Flash, которое размещено на странице Drupal. Некоторые части приложения Flash должны быть доступны всем пользователям, но некоторые должны быть доступны только зарегистрированному пользователю. (Конкретная роль не имеет значения, просто они являются авторизованными пользователями сайта).

Изнутри Flash я могу определить, вошел ли пользователь в систему, сняв с экрана страницу «? Q = user», но это очень хрупко. Каков «правильный» способ сделать это? При необходимости я могу установить дополнительные модули, но они должны быть совместимы с Drupal 6, а не 5.

Точно так же, если в данный момент не зарегистрировано ни одного пользователя, как я могу взять предоставленные мне имя пользователя и пароль и войти в систему (или определить, что пароль неверный)?

Ответы [ 3 ]

4 голосов
/ 12 ноября 2008

«Правильное» решение

вы, вероятно, захотите посмотреть на что-то вроде сервисного модуля . По сути, вы хотите предоставить пользовательские сервисы вашему флеш-приложению, чтобы вы могли отправлять запросы (через XML-RPC или любую другую реализацию по вашему выбору), чтобы получить информацию типа «какой доступ имеет текущий вошедший в систему пользователь» или «войти в систему этого пользователя с именем пользователя x и паролем y "и т.д ...

Быстрое решение "сделай сам"

Если вы знакомы с разработкой модулей, вы можете быстро создать свой собственный модуль, чтобы просто получить необходимую вам функциональность, без необходимости проходить через «настоящий» слой веб-сервисов. Вот краткий пример создания модуля под названием «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';
       }
   }

поместите эти два файла в каталог «myservices» в каталоге ваших модулей, активируйте его и перейдите на http://yourdomain.com/myservices/user

если вы авторизуетесь, он просто вернет yes, а если нет no и т. Д., Который вы можете получить в своем флэш-приложении.

2 голосов
/ 15 ноября 2008

Я смог сделать это, используя сервисы «system» и «user» Drupal:

  • установить Сервисный модуль
  • включить «системные» и «пользовательские» сервисы
  • для кода ниже, отключите ключи API. (Или оставьте их включенными и предоставьте дополнительные аргументы)
  • разрешение как авторизованным, так и анонимным пользователям на доступ к сервисам

На момент написания этой статьи служба AMFPHP еще не портирована на Drupal 6, поэтому я использовал XMLRPC. Чтобы использовать XMLRPC из ActionScript, я использовал вспомогательную библиотеку в as3-rpclib . Эта библиотека была написана для ActionScript2, поэтому использование ее с Flex3 потребовало от меня ее исправления, как описано на этой странице (прокрутите страницу вниз и найдите комментарий 10 мая 2008 года, выполнив команду "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);
}
0 голосов
/ 26 февраля 2009

Я знаю, что до того, как этот пост был изначально создан, пройти долгий путь, но если вы все еще интересуетесь этим и не потратили много времени на его изучение, я выяснил, как успешно обработать логин с помощью флеш-памяти. документ. (Тот, который является встроенным или внешним в этом отношении.) Это даже не требует, чтобы AMFPHP был установлен в системе. (Это хорошо, потому что в последний раз я проверял, что сервисный модуль, от которого зависит AMFPHP, еще не имеет рекомендованного статуса.)

Я настроил демонстрационную страницу здесь: AS3 Логин демо-страницы

Вы можете войти в систему и выйти из системы, и она обнаружит, если вы уже вошли в систему. Это все еще в процессе разработки, но большая часть необходимого вам материала выложена для вас.

Если вы хотите просмотреть документацию и получить копию источника, все это доступно здесь: www.andrewnprice.com

Надеюсь, это поможет. Я должен буду обновить это демо где-нибудь на следующей неделе, поэтому проверьте, хотите ли вы добавить некоторые другие функции, о которых я упомянул в сообщении.

...