프로그램 설치 및 체험(?)은 아래의 INSTALL NOW을 클릭해주세요 ^^
이제 air프로젝트를 하나 생성합니다.
<?xml version="1.0" encoding="utf-8"?>
<mx:WindowedApplication xmlns:mx="http://www.adobe.com/2006/mxml"
layout="vertical" width="300" height="300"
horizontalAlign="center" verticalAlign="middle"
verticalScrollPolicy="off" horizontalScrollPolicy="off">
<mx:Script>
<![CDATA[
import flash.net.navigateToURL;
import mx.rpc.events.FaultEvent;
import mx.controls.Alert;
import mx.rpc.events.ResultEvent;
import com.mudchobo.MudchoboOAuth;
private var mudchoboOAuth:MudchoboOAuth;
private var consumerToken:String = "자신의 Consumer Token";
private var consumerSecret:String = "자신의 Consumer Secret";
private var requestTokenURL:String = "http://www.storyq.net/oauth/request_token";
private var accesstokenURL:String = "http://www.storyq.net/oauth/access_token";
private var authorizeURL:String = "http://www.storyq.net/oauth/authorize";
private function login():void
{
// RequestToken 요청
mudchoboOAuth = new MudchoboOAuth(consumerToken, consumerSecret);
mudchoboOAuth.requestOAuth(new Object(), requestTokenURL, "POST",
requestTokenResultHandler, requestTokenFaultHandler);
currentState = "stateRequestToken";
}
private function logout():void
{
mudchoboOAuth = null;
currentState = "";
}
private function loginConfirm():void
{
// AccessToken요청
mudchoboOAuth.requestOAuth(new Object(), accesstokenURL, "POST",
accessTokenResultHandler, accessTokenFaultHandler);
}
private function loginCancel():void
{
Alert.show("로그인에 실패했습니다.");
currentState = "stateStart";
}
// RequestToken 요청 성공 시
private function requestTokenResultHandler(event:ResultEvent):void
{
currentState = "stateLogin";
mudchoboOAuth.parseData(event.result.toString());
authorizeHTML.location = mudchoboOAuth.authorizeSite(authorizeURL);
}
// RequestToken 요청 실패 시
private function requestTokenFaultHandler(event:FaultEvent):void
{
Alert.show(event.fault.toString() + "요청이 잘못 되었습니다.");
currentState = "stateStart";
}
// AccessToken 요청 성공 시
private function accessTokenResultHandler(event:ResultEvent):void
{
currentState = "stateShowMyQ";
mudchoboOAuth.parseData(event.result.toString());
// 스토리큐에서 자신의 큐리스트를 가져온다.
mudchoboOAuth.requestOAuth(new Object(), "http://www.storyq.net/boxes/mine.xml", "GET",
getQResultHandler, getQFaultHandler);
}
// AccessToken 요청 실패 시
private function accessTokenFaultHandler(event:FaultEvent):void
{
Alert.show(event.fault.toString() + "요청이 잘못 되었습니다.");
currentState = "stateStart";
}
// 자신의 큐리스트 가져오기 요청 성공 시
private function getQResultHandler(event:ResultEvent):void
{
dgQ.dataProvider = event.result.boxes.box;
}
// 자신의 큐리스트 가져오기 요청 실패 시
private function getQFaultHandler(event:FaultEvent):void
{
Alert.show(event.fault.toString() + "가져오는 도중 실패했습니다.");
}
// 버튼으로 다시 요청하기
private function clickReplyHandler():void
{
mudchoboOAuth.requestOAuth(new Object(), "http://www.storyq.net/boxes/mine.xml", "GET",
getQResultHandler, getQFaultHandler);
}
// 더블클릭 시 해당 큐로 이동
private function doubleClickDgQ():void
{
if (dgQ.selectedItem.uri != null)
{
navigateToURL(new URLRequest(dgQ.selectedItem.uri), "_blank");
}
}
]]>
</mx:Script>
<mx:states>
<mx:State name="stateStart">
<mx:SetProperty name="width" value="300"/>
<mx:SetProperty name="height" value="300"/>
</mx:State>
<mx:State name="stateRequestToken">
<mx:AddChild position="lastChild">
<mx:Label text="잠시만 기다려주세요..."/>
</mx:AddChild>
<mx:SetProperty target="{btnLogin}" name="enabled" value="false"/>
</mx:State>
<mx:State name="stateLogin">
<mx:SetProperty name="width" value="1024"/>
<mx:SetProperty name="height" value="768"/>
<mx:AddChild position="lastChild">
<mx:HTML width="1024" height="642" id="authorizeHTML"/>
</mx:AddChild>
<mx:RemoveChild target="{btnLogin}"/>
<mx:AddChild relativeTo="{authorizeHTML}" position="before">
<mx:HBox id="hbox1">
<mx:Button label="확인" click="loginConfirm()"/>
<mx:Button label="취소" click="loginCancel()"/>
</mx:HBox>
</mx:AddChild>
<mx:AddChild relativeTo="{hbox1}" position="before">
<mx:Text text="아래 창에서 StoryQ사이트 로그인페이지로 이동합니다. 
로그인 완료 후, 확인 버튼을 클릭하주세요." height="40"/>
</mx:AddChild>
</mx:State>
<mx:State name="stateShowMyQ">
<mx:RemoveChild target="{btnLogin}"/>
<mx:AddChild position="lastChild">
<mx:Button label="로그아웃" id="btnLogout" click="logout()"/>
<mx:Button label="다시 가져오기" id="btnReply" click="clickReplyHandler()"/>
</mx:AddChild>
<mx:SetProperty name="width" value="550"/>
<mx:SetProperty name="height" value="422"/>
<mx:AddChild position="lastChild">
<mx:DataGrid width="522" height="328" id="dgQ"
doubleClickEnabled="true" doubleClick="doubleClickDgQ()">
<mx:columns>
<mx:DataGridColumn headerText="제목" dataField="title"/>
<mx:DataGridColumn headerText="주소" dataField="uri"/>
</mx:columns>
</mx:DataGrid>
</mx:AddChild>
</mx:State>
</mx:states>
<mx:Button label="스토리큐에 로그인" id="btnLogin" click="login()"/>
</mx:WindowedApplication>
대충만들어서 코드가 지저분합니다만-_-;
아마 알아보실 수 있을듯(응?-_-)합니다.
프로그램을 실행하면, 로그인버튼이 있는데, 로그인 버튼을 클릭하면, 위에서 말한 RequestToken절차가 실행됩니다. RequestToken을 얻어오게 되면, AIR프로그램은 자신의 브라우저를 하나 열어서 로그인 RequestToken을 파라미터로 한 Authorize사이트로 이동합니다.
여기서 사용자는 자신의 아이디로 로그인을 합니다. 로그인이 완료되면, 서버쪽에서 AccessToken을 만들어놓습니다.
로그인 후 위에 확인버튼을 클릭하게 되면, 클라이언트에서는 AccessToken절차가 시작됩니다. AccessToken을 가져온 뒤 그 해당 AccessToken을 이용해 보호된 자원에 접근하는 과정입니다.
접근해서 가져온 데이터는 자신의 큐리스트를 보여주는 겁니다.
자신의 큐들을 데이터그리드에 넣었으며, 그 데이터그리드의 해당 칼럼을 더블클릭하게 되면 해당 큐로 이동하게 됩니다. 정말 별거없네-_-;
위에 코드는 위와 같은 절차로 되어있습니다.
혹시...Oauth로 삽질하시는 분은 이 글로 도움이 되었으면 하네요 ^^
이전 글 링크 - http://mudchobo.tomeii.com/tt/323
PS. 이 짓으로 추석을 날렸습니다-_-;

당신의 의견을 작성해 주세요.
안녕하세요~
AIR로 만드셨네요^^. 와우~ 저도 함 배워봐야겠어요~
^^
앗~ aproxacs님 반가워요~ ^^
AIR는 데스크탑애플리케이션 제작하는데 매우 쉽게 할 수 있어요^^
그나저나 스토리큐는 정말 대단한 것 같아요 ^^
근데 궁금한게 있는데요. aproxacs는 어떻게 읽어요?-_-;
스토리큐에 종종 놀러 오세요. ㅎㅎ
저는 '아프락삭스'라고 읽어요^^;
아......그렇게 읽는구나....
아네 스토리큐에 자주 놀러갈께요 ^^
스토리큐도 리뷰한번해야겠네요 ^^
방명록에 글도 남겼어요 ^^
html페이지를 띄워 인증한다음 그데이터를 AIR에서 사용하는것으로 보이는데(AIR Html페이지를 띄우는건 지원하지만).. 그냥 100% Flash와 Actionscript로는 힘들듯보이는데요. 제가생각하는것이 맞는지 궁금하네요.
아넵! 인증은 꼭 브라우저에서 해야합니다.
OAuth인증방식은 request토큰을 받으면 그것으로 인증페이지를 연다음에 로그인을 합니다.
그러면 서버에는 accessToken이 생성되는데, 그것을 가져와서 그것을 이용해서 보호된 자원에 접근하는 방식입니다^^
로그인은 꼭 브라우저에서 해야하는 것입니다^^
리스트 가져올 때 RPC Fault faultString="Http request error" faultCode="Server.Error.Request" faultDetail="Error:[IOErrorEvent type="opError" bubbles=false cancelable=false eventPhase=2 text="Error #2032" errorID=2032]. URL:http://www.stroyq/boxes/mine.xml"] 가져오는도중실패했습니다.
라고뜨는데 왜그럴까요? 알려주세요^_^;
안녕하세요~
왜그런지는 모르겠는데, URL에서 www.storyq라고만 되어있네요.
뭔가 주소를 잘못 입력한 것 같아요
확인해보세요 ^^
글 상단의 Air프로그램을 설치해서 사용했는데 저런 에러메시지가 떴어요
음...
제가 에러를 덜썼었네요.
[RPC Fault faultString="HTTP request error" faultCode="Server.Error.Request" faultDetail="Error: [IOErrorEvent type="ioError" bubbles=false cancelable=false eventPhase=2 text="Error #2032" errorID=2032]. URL: http://www.storyq.net/boxes/mine.xml"]가져오는 도중 실패했습니다.
URL은 정확한데 왜그런지는 잘모르겠습니다..
저도 지금 해보니까 안되네요-_-
확인을 해봐야겠습니다 ㅠㅠ