<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>Jozef Chúťka&#039;s blog &#187; Authorization</title>
	<atom:link href="http://blog.yoz.sk/tag/authorization/feed/" rel="self" type="application/rss+xml" />
	<link>http://blog.yoz.sk</link>
	<description>My life, my work</description>
	<lastBuildDate>Fri, 27 Aug 2010 12:43:46 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.0.1</generator>
		<item>
		<title>Elegant Facebook Login For Desktop Application</title>
		<link>http://blog.yoz.sk/2010/01/elegant-facebook-login-for-desktop-application/?utm_source=rss&amp;utm_medium=rss&amp;utm_campaign=elegant-facebook-login-for-desktop-application</link>
		<comments>http://blog.yoz.sk/2010/01/elegant-facebook-login-for-desktop-application/#comments</comments>
		<pubDate>Fri, 22 Jan 2010 11:24:29 +0000</pubDate>
		<dc:creator>Jozef Chúťka</dc:creator>
				<category><![CDATA[ActionScript]]></category>
		<category><![CDATA[Facebook]]></category>
		<category><![CDATA[Flash / Flex]]></category>
		<category><![CDATA[Authorization]]></category>
		<category><![CDATA[DesktopSession]]></category>
		<category><![CDATA[facebook api]]></category>
		<category><![CDATA[FacebookLogger]]></category>
		<category><![CDATA[FacebookPopup]]></category>
		<category><![CDATA[FlexIFrame]]></category>
		<category><![CDATA[IFrame]]></category>

		<guid isPermaLink="false">http://blog.yoz.sk/?p=915</guid>
		<description><![CDATA[Default facebook login page is usualy opened in new browser window or popup window, so user lose focus from your page. This application opens facebook login page within your flash application, so user will not lose your page. In fact little iframe trick is used. This post connects my 3 previous posts: Flex IFrame – [...]]]></description>
			<content:encoded><![CDATA[<p><img src="http://blog.yoz.sk/wp-content/uploads/elegantFacebookLogin.jpg" alt="" title="elegantFacebookLogin" width="200" height="124" class="alignleft size-full wp-image-920" /></p>
<p>Default facebook login page is usualy opened in new browser window or popup window, so user lose focus from your page. This application opens facebook login page within your flash application, so user will not lose your page. In fact little iframe trick is used.</p>
<p>This post connects my 3 previous posts: <a href="http://blog.yoz.sk/2009/10/flex-iframe-web-browser-in-flash/">Flex IFrame – Web browser in flash</a>, <a href="http://blog.yoz.sk/2009/12/facebooklogger/">FacebookLogger</a> and <a href="http://blog.yoz.sk/2010/01/facebook-extended-permissions-with-authorization-by-overriding-class-in-swc/">Facebook Extended Permissions With Authorization by Overriding Class in swc</a> in order to create elegant solution for facebook connect with your desktop application (means outside facebook iframe or fbml). I recomend to read all previous mentioned posts before trying to run this app.</p>
<p><span id="more-915"></span></p>
<p>Final application (view source enabled)</p>
<p><iframe src="http://blog.yoz.sk/examples/elegantFacebookLogin/" style="border:none;" width="100%" height="600"></iframe></p>
<p>FB class. Read more about <a href="http://blog.yoz.sk/2009/12/facebooklogger/">FacebookLogger</a> class here.</p>
<pre class="brush: as3;">package
{
    import flash.net.URLRequest;
    import flash.net.URLVariables;

    import mx.core.Application;

    import sk.yoz.events.FacebookLoggerEvent;
    import sk.yoz.net.FacebookLogger;

    public class FB extends FacebookLogger
    {
        private static const SINGLETON_LOCK:Object = {};
        private static const _instence:FB = new FB(SINGLETON_LOCK);

        protected var API_KEY:String = &quot;bc55511efba53af7a3529ea9e7d1989b&quot;;
        protected var APP_SECRET:String = &quot;727616ab7a9acb969e7cec3c7de04d79&quot;;

        private var initCallback:Function;

        public function FB(lock:Object)
        {
            super();

            if(lock != SINGLETON_LOCK)
                throw new Error(&quot;Use FB.instance!&quot;);

            addEventListener(FacebookLoggerEvent.CONNECTED, loggerConnectedHandler)
        }

        public static function get instance():FB
        {
            return _instence;
        }

        public function init2(application:Application):void
        {
            if(public::connected)
                return;
            init(API_KEY, APP_SECRET, application.loaderInfo);
        }

        public function initWithCallback(application:Application, callback:Function):void
        {
            initCallback = callback;
            init2(application);
        }

        private function loggerConnectedHandler(event:FacebookLoggerEvent):void
        {
            if(initCallback != null)
                initCallback();
            initCallback = null;
            // now we are connected, your code may go here
        }

        public function openPopup(login_url:String, auth_token:String):void
        {
            var request:URLRequest = new URLRequest(login_url);
            var variables:URLVariables = new URLVariables();

            variables.req_perms = 'publish_stream';
            variables.api_key = facebook.api_key;
            variables.v = facebook.api_version;
            variables.auth_token = auth_token;
            variables.fbconnect = &quot;true&quot;;
            variables.connect_display = &quot;popup&quot;;

            request.data = variables;

            FacebookPopup.open(request);
        }
    }
}</pre>
<p>DesktopSession class. Read more about <a href="http://blog.yoz.sk/2010/01/facebook-extended-permissions-with-authorization-by-overriding-class-in-swc/">Overriding Class in swc</a>.</p>
<pre class="brush: as3;">... some code ...

protected function onLogin(p_event:FacebookEvent):void {
	p_event.target.removeEventListener(FacebookEvent.COMPLETE, onLogin);

	if (p_event.success) {
		_auth_token = (p_event.data as StringResultData).value;

		FB.instance.openPopup(login_url, _auth_token);

		_waiting_for_login = true;
		dispatchEvent(new FacebookEvent(FacebookEvent.WAITING_FOR_LOGIN));
	} else {
		onConnectionError(p_event.error);
	}
}

... some code ...</pre>
<p>FacebookPopup class. Read more about <a href="http://blog.yoz.sk/2009/10/flex-iframe-web-browser-in-flash/">Flex IFrame</a>.</p>
<pre class="brush: xml;">&lt;?xml version=&quot;1.0&quot; encoding=&quot;utf-8&quot;?&gt;
&lt;mx:TitleWindow xmlns:mx=&quot;http://www.adobe.com/2006/mxml&quot; layout=&quot;vertical&quot;
    width=&quot;510&quot; height=&quot;465&quot; xmlns:html=&quot;sk.yoz.html.*&quot; move=&quot;moveHandler()&quot;
    title=&quot;Facebook login&quot;&gt;
&lt;mx:Script&gt;
&lt;![CDATA[
    import mx.core.Application;
    import mx.managers.PopUpManager;

    [Bindable]
    protected var url:String;

    [Bindable]
    protected var fb:FB = FB.instance;

    protected function moveHandler():void
    {
        iframe.positionChanged = true;
        iframe.invalidateProperties();
    }

    public function set request(value:URLRequest):void
    {
        var url:String = value.url;
        url += &quot;?&quot;;
        for(var param:String in value.data)
            url += &quot;&amp;&quot; + param + &quot;=&quot; + value.data[param];
        this.url = url;
    }

    public static function open(request:URLRequest):void
    {
        var window:FacebookPopup = new FacebookPopup();
        window.request = request;
        window.visible = true;
        PopUpManager.addPopUp(window, Application(Application.application));
        PopUpManager.centerPopUp(window);
    }

    protected function validateLogin():void
    {
        fb.validate();
        close();
    }

    protected function close():void
    {
        visible = false;
        PopUpManager.removePopUp(this);
    }

    protected function refresh():void
    {
        iframe.url = url;
    }
]]&gt;
&lt;/mx:Script&gt;
&lt;html:IFrame width=&quot;100%&quot; height=&quot;100%&quot; id=&quot;iframe&quot; autoResize=&quot;true&quot;
    url=&quot;{url}&quot; visible=&quot;{visible}&quot;/&gt;
&lt;mx:HBox width=&quot;100%&quot;&gt;
    &lt;mx:Text text=&quot;Clik Ok after you login to Facebook.&quot; /&gt;
    &lt;mx:Spacer width=&quot;100%&quot; /&gt;
    &lt;mx:Label text=&quot;refresh&quot; click=&quot;refresh()&quot; textDecoration=&quot;underline&quot;
        buttonMode=&quot;true&quot;/&gt;
&lt;/mx:HBox&gt;
&lt;mx:HBox width=&quot;100%&quot; horizontalAlign=&quot;center&quot; &gt;
    &lt;mx:Button label=&quot;Ok&quot; click=&quot;validateLogin()&quot;/&gt;
    &lt;mx:Button label=&quot;Cancel&quot; click=&quot;close()&quot;/&gt;
&lt;/mx:HBox&gt;
&lt;/mx:TitleWindow&gt;</pre>
<p>Application (do not forget to add facebook flex .swc, version 3.4 used in example)</p>
<pre class="brush: xml;">&lt;?xml version=&quot;1.0&quot; encoding=&quot;utf-8&quot;?&gt;
&lt;mx:Application xmlns:mx=&quot;http://www.adobe.com/2006/mxml&quot;&gt;
&lt;mx:Script&gt;
&lt;![CDATA[
    import FB;

    [Bindable]
    private var fb:FB = FB.instance;
]]&gt;
&lt;/mx:Script&gt;
&lt;mx:Button label=&quot;Facebook connect&quot; click=&quot;fb.init2(this)&quot;/&gt;
&lt;mx:Text text=&quot;{fb.connected ? 'connected' : 'not connected'}&quot; /&gt;
&lt;/mx:Application&gt;</pre>
<p>Application html template. <a href="http://blog.yoz.sk/2009/10/flex-iframe-web-browser-in-flash/">More about flexiframe.js here</a>.</p>
<pre class="brush: xml;">... some code ...
&lt;script type=&quot;text/javascript&quot; src=&quot;flexiframe.js&quot;&gt;&lt;/script&gt;
... some code ...</pre>
]]></content:encoded>
			<wfw:commentRss>http://blog.yoz.sk/2010/01/elegant-facebook-login-for-desktop-application/feed/</wfw:commentRss>
		<slash:comments>8</slash:comments>
		</item>
		<item>
		<title>Facebook Extended Permissions With Authorization by Overriding Class in swc</title>
		<link>http://blog.yoz.sk/2010/01/facebook-extended-permissions-with-authorization-by-overriding-class-in-swc/?utm_source=rss&amp;utm_medium=rss&amp;utm_campaign=facebook-extended-permissions-with-authorization-by-overriding-class-in-swc</link>
		<comments>http://blog.yoz.sk/2010/01/facebook-extended-permissions-with-authorization-by-overriding-class-in-swc/#comments</comments>
		<pubDate>Thu, 21 Jan 2010 12:27:10 +0000</pubDate>
		<dc:creator>Jozef Chúťka</dc:creator>
				<category><![CDATA[ActionScript]]></category>
		<category><![CDATA[Facebook]]></category>
		<category><![CDATA[Flash / Flex]]></category>
		<category><![CDATA[Authorization]]></category>
		<category><![CDATA[DesktopSession]]></category>
		<category><![CDATA[facebook api]]></category>
		<category><![CDATA[swc]]></category>
		<category><![CDATA[URLRequest]]></category>

		<guid isPermaLink="false">http://blog.yoz.sk/?p=901</guid>
		<description><![CDATA[It may be not popular, but it is possible to substitute / override whole class from .swc file. Lets say you are using some public api, in our case Facebook actionscript api. I admire work of developer team, but I would like to have some things different. My facebook application requires publish_stream extended permission right [...]]]></description>
			<content:encoded><![CDATA[<p><img src="http://blog.yoz.sk/wp-content/uploads/extendedPermissionWithLoginSmall.jpg" alt="" title="extendedPermissionWithLoginSmall" width="200" height="100" class="alignleft size-full wp-image-911" /></p>
<p>It may be not popular, but it is possible to substitute / override whole class from .swc file. Lets say you are using some public api, in our case <a href="http://code.google.com/p/facebook-actionscript-api/">Facebook actionscript api</a>. I admire work of developer team, but I would like to have some things different. My facebook application requires <a href="http://wiki.developers.facebook.com/index.php/Extended_permissions">publish_stream</a> extended permission right after user login (authorize) my application. Even if official facebook api documentation says it is possible to ask for <a href="http://wiki.developers.facebook.com/index.php/Authorization_and_Authentication_for_Desktop_Applications">extended permission with login.php</a> call (req_perms parameter), our facebook actionscript api does not offer setting this parameter.</p>
<p><span id="more-901"></span></p>
<p>After few moments of research it was clear that login.php call makes <a href="http://code.google.com/p/facebook-actionscript-api/source/browse/trunk/source/actionscript/com/facebook/session/DesktopSession.as">DesktopSession class</a>, method onLogin()&#8230;</p>
<pre class="brush: as3;">... some code ...

protected function onLogin(p_event:FacebookEvent):void {
	p_event.target.removeEventListener(FacebookEvent.COMPLETE, onLogin);

	if (p_event.success) {
		_auth_token = (p_event.data as StringResultData).value;

		//now that we have an auth_token we need the user to login with it
		var request:URLRequest = new URLRequest();
		var loginParams:String = '?';

		if (_offline_access) {
				loginParams += 'ext_perm=offline_access&amp;';
		}

		request.url = login_url+loginParams+&quot;api_key=&quot;+api_key+&quot;&amp;v=&quot;+api_version+&quot;&amp;auth_token=&quot;+_auth_token;

		navigateToURL(request, &quot;_blank&quot;);

		_waiting_for_login = true;
		dispatchEvent(new FacebookEvent(FacebookEvent.WAITING_FOR_LOGIN));
	} else {
		onConnectionError(p_event.error);
	}
}

... some code ...</pre>
<p>Now lets do the dirty work. If it were possible, I would extend DesktopSession class and override just onLogin function, but api creates and uses DesktopSession inside its whole logic, so there is no way to succeed. However, it is possible to override whole class. First, in your flex project (with facebook swc in library path), create directory structure com/facebook/session/ (the same as DesktopSession package defines), than copy <a href="http://code.google.com/p/facebook-actionscript-api/source/browse/trunk/source/actionscript/com/facebook/session/DesktopSession.as">DesktopSession.as</a> file inside. Well, thats it <img src='http://blog.yoz.sk/wp-includes/images/smilies/icon_smile.gif' alt=':-)' class='wp-smiley' />  &#8230; From now, when you publish your application, compilator uses your DesktopSession instead of the one in .swc.</p>
<p>To make the new class working for my needs, onLogin function needs to be changed into something like this:</p>
<pre class="brush: as3;">... some code ...

protected function onLogin(p_event:FacebookEvent):void {
	p_event.target.removeEventListener(FacebookEvent.COMPLETE, onLogin);

	if (p_event.success) {
		_auth_token = (p_event.data as StringResultData).value;

		//now that we have an auth_token we need the user to login with it
		var request:URLRequest = new URLRequest(login_url);
		var variables:URLVariables = new URLVariables();

		variables.req_perms = 'publish_stream';
		variables.api_key = api_key;
		variables.v = api_version;
		variables.auth_token = _auth_token;
		variables.fbconnect = &quot;true&quot;;
		variables.connect_display = &quot;page&quot;;

		request.data = variables;
		navigateToURL(request, &quot;_blank&quot;);

		_waiting_for_login = true;
		dispatchEvent(new FacebookEvent(FacebookEvent.WAITING_FOR_LOGIN));
	} else {
		onConnectionError(p_event.error);
	}
}

... some code ...</pre>
<p>By asking extended permissions with login.php, facebook opens more step authorization dialog where each permissions is separated into own step and user can allow or dont allow each.</p>
<p><img src="http://blog.yoz.sk/wp-content/uploads/extendedPermissionWithLogin.jpg" alt="" title="extendedPermissionWithLogin" width="658" height="713" class="alignnone size-full wp-image-908" /></p>
<p><strong>Important:</strong></p>
<ul>
<li>Even if you send req_perms=publish_stream with login.php, facebook only accepts it when your app is live (not from your desktop testing) &#8230; Functionality already bugged in facebook bugzilla</li>
<li>Even if it is possible to override class this way, consider using it. Next time there may be newer version of .swc with some changes in your overriden class!</li>
</ul>
]]></content:encoded>
			<wfw:commentRss>http://blog.yoz.sk/2010/01/facebook-extended-permissions-with-authorization-by-overriding-class-in-swc/feed/</wfw:commentRss>
		<slash:comments>9</slash:comments>
		</item>
	</channel>
</rss>
