タグ : flickr

flickrのOAuth認証について

airforandroidでstageWebViewをつかったflickrのOAuth認証を行うサンプルです。

※ただしyahoo!のログイン画面がモバイルに最適化されていない?もしくはflickrのリダイレクト先ログイン画面がPCになっているため、若干難有りですが以下の方法でOAuthさせることができます。

その前にとりあえず作業の流れは以下のような感じです。

おおまかな流れ

  • flickrにAPIキーとシークレットコードを送信してfrobをもらいます。
  • frobをもらったら認証画面(yahoo.comにログインしてなかったらログイン画面)へ
  • リダイレクト先のURLの末尾の新しいfrobを取得したら再度それを送りつけます。
  • トークンをゲット!!して認証完了。このトークンを利用して各種APIの操作を行うことが出来ます。

参考資料:

利用するライブラリ:

下のサンプルではAuth完了後に自分のフォトセットのリストを取得しに行ってます。

現状as3flickrlibにはUploadが未実装なので時間のあるときにCameraRollから写真をアップロードできる物を試してみます。

package
{
	import com.adobe.webapis.flickr.AuthResult;
	import com.adobe.webapis.flickr.FlickrService;
	import com.adobe.webapis.flickr.methodgroups.Auth;
	import com.adobe.webapis.flickr.AuthPerm;
	import com.adobe.webapis.flickr.events.FlickrResultEvent;
	import com.adobe.webapis.flickr.PhotoSet;
	import flash.display.Sprite;
	import flash.events.Event;
	import flash.geom.Rectangle;
	import flash.media.StageWebView;

	public class Main extends Sprite
	{
		private const APIKEY:String = "APIキー";
		private const APISECRET:String = "シークレットコード";
		private const callbackURL:String = "コールバックするURL";
		private var service:FlickrService;
		private var auth:Auth;
		private var frob:String = "";
		private var sid:String = "";
		private var webview:StageWebView;

		public function Main()
		{
			//flickrAPIの初期化
			service = new FlickrService(APIKEY);
			service.secret = APISECRET;
			service.addEventListener(FlickrResultEvent.AUTH_GET_FROB, onGetFrob);
			service.addEventListener(FlickrResultEvent.AUTH_GET_TOKEN, onGetToken);

			auth = new Auth(service);
			auth.getFrob();

		}
		//frobをリクエスト
		private function onGetFrob(e:FlickrResultEvent):void {
			if (e.success) {
				frob = e.data.frob;
				var url:String = service.getLoginURL(frob, AuthPerm.WRITE);
				createStageWebView(url);
			}
			service.removeEventListener(FlickrResultEvent.AUTH_GET_FROB, onGetFrob);
		}

		//stageWebViewを生成
		private function createStageWebView(url:String):void {
			webview = new StageWebView();
			webview.stage = this.stage;
			webview.viewPort = new Rectangle(0, 0, stage.stageWidth, stage.stageHeight);
			webview.loadURL(url);
			webview.addEventListener(Event.LOCATION_CHANGE, onLocationChange);
		}

		//認証後のアクション
		private function onLocationChange(e:Event):void {
			if (webview) {
				var checkcnt:int = webview.location.indexOf(callbackURL);
				//ジャンプ先URLがcallbackURLと一致した場合↓
				if (checkcnt >= 0) {

					//新しいfrobを取得
					var urlarray:Array = webview.location.split("=");
					frob = urlarray[1] as String;

					//webviewを廃棄
					webview.removeEventListener(Event.LOCATION_CHANGE, onLocationChange);
					webview.dispose();

					//getTokenをリクエスト
					auth.getToken(frob);
				}
			}
		}

		//auth完了
		private function onGetToken(e:FlickrResultEvent):void {
			if (e.success) {
				var authResult:AuthResult = AuthResult(e.data.auth);
				sid = authResult.user.nsid;

				service.token = authResult.token;
				service.permission = authResult.perms;

				//これで完了あとは焼くなり、煮るなり!!↓ではphotoSetを取得
				service.photosets.getList(sid);
				service.addEventListener(FlickrResultEvent.PHOTOSETS_GET_LIST,onGetList);

			}else {
				trace("failed");
			}
		}

		private function onGetList(e:FlickrResultEvent):void {
			var psets:Array = e.data.photoSets as Array;
			var firstSet:PhotoSet = psets[0] as PhotoSet;
			trace(firstSet.description);
		}
	}
}