Nakamap OAuth2.0 API Sample

by 9re
mashup awards7では
http://ma7.mashupaward.jp/apis/77
nakamap apiを使った作品も募集しているみたいとのことなので、
早速auth認証から実際にapiを使ってみるところまでをflashだけでやってみました。

・ナカマップアカウントを作って
http://developer.nakamap.com/
アプリを新規に作って、
アプリのclient_id、client_secret(人に教えないでね!)をコピペしてみてください。
プロフィールが表示されるところまではやってみましたが、
努力次第では
スマホ、ウェブが連動する面白アプリも?!

nakamapスマホ版は
http://nakamap.com/ja


※このサンプル用のアプリを作るにはドメインを
Site Domain: swf.wonderfl.net
と指定してください。
♥2 | Line 173 | Modified 2011-09-16 13:11:17 | MIT License
play

ActionScript3 source code

/**
 * Copyright 9re ( http://wonderfl.net/user/9re )
 * MIT License ( http://www.opensource.org/licenses/mit-license.php )
 * Downloaded from: http://wonderfl.net/c/wnaO
 */

package {
    import flash.display.Loader;
    import flash.events.IOErrorEvent;
    import flash.errors.IOError;
    import flash.system.Security;
    import flash.events.Event;
    import flash.net.URLLoader;
    import flash.text.TextFormatAlign;
    import flash.text.TextFormat;
    import flash.net.URLVariables;
    import flash.net.URLRequestMethod;
    import flash.net.URLRequest;
    import flash.net.navigateToURL;
    import flash.events.MouseEvent;
    import flash.text.TextFieldType;
    import flash.text.TextField;
    import flash.display.Sprite;
    import com.adobe.serialization.json.JSON;
    
    public class FlashTest extends Sprite {
        private static const CLIENT_ID:String = "client_id";
        private static const CLIENT_SECRET:String = "client_secret";
        private static const AUTH_DIALOG_ENDPOINT:String = "https://nakamap.com/dialog/oauth";
        private static const ACCESS_TOKEN_ENDPOINT:String = "https://thanks.nakamap.com/oauth/access_token";
        private static const READ_BASIC:String = "read_basic";
        private static const WRITE_BASIC:String = "write_basic";
        private var _forms:Object = {};
        
        public function FlashTest() {
            stage.align = "tl";
            stage.scaleMode = "noScale";
            var auth_code:String = loaderInfo.parameters.code;
            showHeader();
 
            createForm(CLIENT_ID, 10, 50);
            createForm(CLIENT_SECRET, 10, 85);
            Security.loadPolicyFile("https://thanks.nakamap.com/crossdomain.xml");
            if (auth_code) {
                getAccessToken(auth_code);
            } else {
                showStartAuth();
            }
        }
        
        private function getAccessToken(auth_code:String):void {
            var log:TextField = new TextField;
            log.y = 150;
            log.width = 465;
            log.appendText('got auth code: ' + auth_code + '\n\n');
            addChild(log);
            
            createButton("get access token", 210, 120, function ():void {
                var vars:URLVariables = new URLVariables;
                vars.grant_type = "authorization_code";
                vars.code = auth_code;
                vars.redirect_uri = getSWFUrl();
                vars[CLIENT_ID] = getValue(CLIENT_ID);
                vars[CLIENT_SECRET] = getValue(CLIENT_SECRET);
                
                var req:URLRequest = new URLRequest;
                req.url = ACCESS_TOKEN_ENDPOINT;
                req.data = vars;
                req.method = URLRequestMethod.POST;
                var ldr:URLLoader = new URLLoader;
                ldr.addEventListener(Event.COMPLETE, function ():void {
                    var obj:Object = JSON.decode(ldr.data);
                    tryProtectedAPI(obj.access_token);
                });
                ldr.addEventListener(IOErrorEvent.IO_ERROR, function ():void {
                    // auth error or any other
                });
                ldr.load(req);
            });
        }
        
        private function tryProtectedAPI(token:String):void {
            var vars:URLVariables = new URLVariables;
            vars.token = token;
            const me:String = "https://thanks.nakamap.com/1/me";
            var req:URLRequest = new URLRequest;
            req.url = me;
            req.method = URLRequestMethod.GET;
            req.data = vars;
            
            var ldr:URLLoader = new URLLoader;
            ldr.addEventListener(Event.COMPLETE, function ():void {
                var obj:Object = JSON.decode(ldr.data);
                renderProfile(obj);
            });
            ldr.addEventListener(IOErrorEvent.IO_ERROR, function ():void {
                // auth error or any other
            });
            ldr.load(req);
        }
        
        private function renderProfile(prof:Object):void {
            var sp:Sprite = new Sprite;
            var ldr:Loader = new Loader;
            var tfProf:TextField = new TextField;
            tfProf.text = prof.name + '\n' + prof.description;
            sp.addChild(tfProf);
            ldr.contentLoaderInfo.addEventListener(Event.COMPLETE, function ():void {
                tfProf.x = ldr.width + 10;
            });
            ldr.load(new URLRequest(prof.icon));
            sp.addChild(ldr);
            sp.y = 200;
            sp.x = 10;
            addChild(sp);
        }

        private function showHeader():void {
            var tf:TextField = new TextField;
            tf.background = true;
            tf.backgroundColor = 0x333333;
            tf.textColor = 0xffffff;
            tf.mouseEnabled = false;
            tf.width = 465;
            tf.height = 20;
            var tfm:TextFormat = new TextFormat;
            tfm.align = TextFormatAlign.RIGHT;
            tf.text = "nakamap api oauth sample";
            tf.setTextFormat(tfm);
            addChild(tf);
        }
        
        private function showStartAuth():void {
            createButton("start auth", 230, 120, function ():void {
                var vars:URLVariables = new URLVariables;
                vars[CLIENT_ID] = getValue(CLIENT_ID);
                vars.response_type = "code";
                vars.scope = ([READ_BASIC, WRITE_BASIC]).join(" ");
                vars.redirect_uri = getSWFUrl();
                var req:URLRequest = new URLRequest;
                req.url = AUTH_DIALOG_ENDPOINT;
                req.method = URLRequestMethod.GET;
                req.data = vars;
                navigateToURL(req, "_blank");
            });
        }
        
        private function getSWFUrl():String {
            var url:String = loaderInfo.loaderURL;
            var query_start:int = url.indexOf("?");
            return query_start > -1 ? url.substring(0, query_start) : url;
        }

        
        private function getValue($name:String):String {
            var input:TextField = _forms[$name] as TextField;
            return input.text;
        }
        
        private function createButton($label:String, $x:int, $y:int, $onClick:Function):void {
            var sp:Sprite = new Sprite;
            sp.buttonMode = true;
            sp.tabEnabled = false;
            
            var tf:TextField = new TextField;
            tf.border = true;
            tf.mouseEnabled = false;
            tf.text = $label;
            tf.width = tf.textWidth + 4; tf.height = tf.textHeight + 4;
            sp.addEventListener(MouseEvent.CLICK, $onClick);
            sp.addChild(tf);
            sp.x = $x; sp.y = $y;
            
            addChild(sp);
        }
       
        private function createForm($label:String, $x:int, $y:int):void {
            const LABEL_WIDTH:int = 60;
            
            var sp:Sprite = new Sprite;
            sp.x = $x;
            sp.y = $y;
            var lb:TextField = new TextField;
            lb.text = $label + ":";
            lb.x = LABEL_WIDTH - lb.textWidth + 2;
            lb.mouseEnabled = false;
            sp.addChild(lb);
            
            var input:TextField = new TextField;
            input.type = TextFieldType.INPUT;
            input.displayAsPassword = true;
            input.width = 200;
            input.height = 20;
            input.border = true;
            input.x = $x + LABEL_WIDTH;
            _forms[$label] = input;
            sp.addChild(input);
            
            addChild(sp);
        }
  }
}

Forked