RIAブログ

RIAやUIを中心に取り上げます。今日の一選ウェブサイトを毎日更新中です

FlashからOAuth認証でTwitterから発言できるのか?

6件のコメントがあります

このエントリーを含むはてなブックマークはてなブックマーク - FlashからOAuth認証でTwitterから発言できるのか? この記事をクリップ!Livedoorクリップ - FlashからOAuth認証でTwitterから発言できるのか? Yahoo!ブックマークに登録 BuzzurlにブックマークBuzzurlにブックマーク このエントリをつぶやくこのWebページのtweets Share on Tumblr FC2ブックマークへ追加 newsing it! この記事をChoix! Googleブックマークに追加 Bookmark this on Delicious Digg This

TwitterのBACIS認証でのAPI提供がもうじき8月16日に停止されます。
みなさんの使っているアプリはもうOAuth認証に対応しているものでしょうか?

oauth

そこで新しい(といってもだいぶ前から提供されていました)OAuth認証をFlash(AS3.0)で出来るのか試してみました。

今までのBACIS認証では各TwitterクライアントにID,PASSを登録してつぶやき等を行っており第三者にID,PASSを預けていました。それではセキュリティ的に問題があると言う事で、OAuth認証が採用されたそうです。
OAuth認証とは、クライアントをTwitterのアカウントで認証する(Twitterのページで認証を行う。下図)とキーがクライアントに渡され、以後認証などをする事なぐTwitterの機能を使えるようになるものです。

twitteroauth1

しかし、このOAuth認証を知らない人は多いと思います。
一度認証を許可してしまうと、そのクライアントアプリはTwiiterの操作権を持つことになり、それいこう認証なしでつぶやき等が出来てしまいます。(認証はTwitterサイトでいつでも任意で解除することができます。なので一度アクセス権を取得したアプリは認証が解除されるまで、アクセス権を保持しています。)

つい先日から大量にやってくる、マイケルジャクソンのDMもこのOAuth認証を利用したものです。知り合いから送られてくるので、気軽にDMを見てリンク先をクリックするとTwitterの認証画面に進みます。そしてTwitter上のページだからといって安心して許可ボタンを押すと、その瞬間にこのアプリに自分のアカウントの操作権利を渡してしまい、結果、自分のフォロワーにDMを大量に送ってしまう事になってしまうのです。

こんな、ちょっとややこしいOAuth認証をFlash(ActionScript3.0)のみでできるのかが今日の本題です。

結論としてはFlashのみでWEBアプリとしてOAuth認証できませんでした。

なぜなら、twitterではクロスドメインが解放されておらず、Flashからいっさい通信することができないからです。なので、ローカルでの場合?を想定して進んで行きます。AIRだとクロスドメインも関係ないので出来るのではないでしょうか。

だいたいの流れはこうのようになります。

1、twitterでアプリを登録する(consumerKey, consumerSecretの発行)
2、ユーザーがアプリのアクセスを承認
3、PIN(7桁の数字)を取得
4、アクセストークン(Key, Secret)を取得
5、つぶやく

Flashで制作して行きますが、フルスクラッチで行うのは厳しいので、ライブラリをふんだんに使って行きます。また、Flexのライブラリも利用しましたので、FlexのSDKをダウンロードしFlashからクラスパスを通しておきます。クラスパスの設定(SDKpass)/frameworks/libsを設定すだけでflashでもmxライブラリが使えるようになります。といってもグリッドなどのコンポーネントが使える訳ではないです。

今回利用したライブラリ

1、twitterでアプリを登録する(consumerKey, consumerSecretの発行)
まず始めにTwitterのサイトに行き、設定>関連アプリ>開発者のかたへ>新しいアプリケーションの追加と進み、アプリケーションを登録します。ここではアプリケーションの名称、開発者、詳細、アイコン設定等の設定をこないます。ここで、クライアントアプリケーションかブラウザアプリの選択を行います。これは上記3でPINを取得後の処理が違います。ブラウザアプリではPIN取得後、設定URLにリダイレクトされます。クライアントアプリではPINが表示されるようになります。今回はローカルでの作業ですのでクライアントアプリケーションにしました。登録が完了するとconsumerKey, consumerSecretを取得できます。このconsumerKey, consumerSecretは今回の最終的な認証の鍵の鍵の鍵の鍵のようなものだと思います。

2、ユーザーがアプリのアクセスを承認
ここからがASによる作業になります。


oauth = new OAuth(consumerKey, consumerSecret);
loader = oauth.getRequestToken("http://twitter.com/oauth/request_token");
loader.addEventListener(Event.COMPLETE, requestTokenHandler);

consumerKey, consumerSecretには1で取得した文字列を入れます。
このリクエストで、3でPINを取得する為の認証先のURLを作る為のrequestTokenを作ります。必要な値を入れるだけで殆どライブラリがやってくれます。

3、PIN(7桁の数字)を取得


requestToken = OAuthUtil.getTokenFromResponse(e.currentTarget.data as String);
var request:URLRequest = oauth.getAuthorizeRequest("http://twitter.com/oauth/authorize", requestToken.key);
navigateToURL(request, "_blank");

認証ページへのURLの生成です。といってもここもライブラリが全部やってくれています。
ここでnavigateToURLをしていますが、ここで一度Twitterのサイトに行く事でアプリの認証を行います。そしてPINをサイト上に表示させる、または1で登録したページへのリダイレクトを利用してPINを取得します。
今回はサイトに表示させ、それを手でコピペしましたが、AIR等ではWindowでブラザを開く事が出来るので、コールバックの実装も出来ると思います。今回ここは省略です。

pin

PINを取得して表示した画面

4、アクセストークン(Key, Secret)を取得


var loader:URLLoader = oauth.getAccessToken("http://twitter.com/oauth/access_token", requestToken, {oauth_verifier:pin});
loader.addEventListener(Event.COMPLETE, accessTokenHandler);

3で取得したPINでAccessTokenを取得します。このAccessTokenはがOAuth認証の最後の鍵となります。なので一度認証を行いAccessTokenを所得したら、ユーザーがアプリの認証を解除するまで有効となります。Flashなどで利用する場合SharedObjectなどで保存してけば、次回からは認証なしでTwiiter機能が使える様になります。

5、つぶやく
いよいよつぶやきですが、ただ単にリクエストを送るだけではつぶやく事は出来ません。


var consumerToken:OAuthConsumer = new OAuthConsumer(consumerKey, consumerSecret);
var oauthReq:OAuthRequest = new OAuthRequest("POST", "http://api.twitter.com/1/statuses/update.xml", {oauth_version: "1.0", status: msgb.text}, consumerToken, accessToken);
var auth:String = oauthReq.buildRequest(new OAuthSignatureMethod_HMAC_SHA1, OAuthRequest.RESULT_TYPE_POST);
auth = auth.split("&").join("\",");
auth = auth.split("=").join("=\"");
auth = auth.replace(/,status=.*/, "");
var authHeader:URLRequestHeader = new URLRequestHeader("Authorization", "OAuth " + auth);
var req:HttpRequest = new Post();
req.addHeader("Authorization",authHeader.value);
req.setFormData([{
	name:"status",
	value:msgb.text
}]);
var client:HttpClient = new HttpClient();
client.addEventListener(HttpRequestEvent.COMPLETE, twtcomp);
client.request(new URI("http://api.twitter.com/1/statuses/update.xml"), req);

通常のURLRequest,URLLoaderではカスタムのヘッダーの利用が出来ないそうで、ここでもライブラリです。Signatureの生成等や、つぶやき本文への追加したヘッダーを作り、HttpRequestを利用してリクエストしてつぶやき完了です。これだとつぶやきっぱなしになってしますので、HttpRequestEvent.COMPLETEイベントを追加してリクエスト監視しています。これで終了です。
twit_test

実際にtwitterで確認してみると、発言元のviaの箇所が登録したアプリ名になっているのが確認できます。
結論として、ローカルアプリならflashのみでOAuthできる事が分かりました。けど、セキュリティサンドボックスの壁がある以上やっぱFlashだけでは無理なので、webアプリの場合はやっぱり無理なんだろうか?8月16日以後の動向に注目です。

今回はこの記事を書くにあたってこちらのブログを大変参考にさせて頂きました。有り難うございました。

  • Share/Bookmark


立石 直敬

2009年名古屋市立大学大学院芸術工学研究科修了。
webアプリケーションに興味を持ち、アルバイトとして参加後、2009年10月入社。Flashを中心にRIA、UIを担当。
対応範囲拡大のため日々勉強中。

Written by 立石 直敬

8 月 8th, 2010 at 1:50 am

Posted in 作ってみた

Tagged with , , ,

6 Responses to 'FlashからOAuth認証でTwitterから発言できるのか?'

Subscribe to comments with RSS or TrackBack to 'FlashからOAuth認証でTwitterから発言できるのか?'.

  1. 参考にさせていただきました。
    ここで使われているライブラリで「iotashan」が
    入手できなかったのですが
    DLのURLなどご存知でいたら教えていただきたいのですが・・・

    UKONN

    7 1 月 11 at 12:05 PM

  2. 初めまして!whaison =大塚 昇と申します。
    RIAブログさんのほうでご解説いただいた方法にHTMLロードを追加して
    一応画面的にはOauthが内部で簡潔するサンプルアプリをアップしました。もしこの記事をご閲覧になっておられる方で簡単なサンプルがほしいと思っている方がいましたらこちらでflaファイルもクラスもダウンロード
    できるようにしています。

    http://whaison.tumblr.com/WhaisonTweetOauthAir

    関連記事
    http://whaison.jugem.jp/?eid=376

    whaison

    10 1 月 11 at 1:43 PM

  3. 懇切丁寧なサンプルでした。
    ライブラリのすべてそろっておりたすかりました。
    ありがとうございます。

    UKONN

    11 1 月 11 at 12:26 AM

  4. 久々に、先日、教えてもらいましたAIRアプリを確認することがありましたが
    そのAPPでのツイートができなくなっていました。

    PINを得るための画面で、「認証しても以下のことはできません」という
    注意書きが気になります。その中にツイートも含まれるからです。
    下記URLの画面キャプチャを見てください。

    デバッグでやってみるとツイート完了まで行くのですが
    実際のタイムラインには書きこまれていません。

    もし、この件でご存知のことがあれば教えていただきたいのですが。
    よろしくお願いします。

    http://pengpeng.chips.jp/tweet.png

    UKONN

    11 8 月 11 at 12:08 PM

  5. OAuthのアクセスレベルがread onlyになっているのではないでしょうか??
    アプリの設定で確認する事ができます。

    twitterドキュメント
    https://dev.twitter.com/docs/application-permission-model

    OAuth画面の変更にかんして
    http://www.sanbo-n.info/2011/05/09145314.php

    立石 直敬

    16 8 月 11 at 12:39 PM

  6. さっそく、ありがとうございます。
    設定がそうなっていました
    失礼しました。

    UKONN

    21 8 月 11 at 11:53 AM

Leave a Reply

Get Adobe Flash playerPlugin by wpburn.com wordpress themes