TwitterでOAuth認証を行う(2:Twitterの認証ページをブラウザで開く)


TwitterでOAuth認証を行う(1:Twitterへのアプリケーション登録)“ではアプリケーションをTwitterへ登録するまでを
紹介しました。

今回からは実際にOAuth認証をTwitter4Jを使用してAndroidアプリケーションで実装していきます。

サンプルはこちらからSVNなどを使用してダウンロードしてください。

実装する処理は以下のような流れになります。

  1. 画面上のボタンを押下すると、ブラウザが起動し、Twitterの認証画面が表示される
  2. Twitterの認証画面でIDとパスワードを入力し、許可ボタンを押下すると、アプリケーションへIntentが発行される
  3. ブラウザから発行されたIntentから認証情報を取得する

今回は1と2の処理を実装していきます。

2011/5/1:AndroidManifestとサンプルコードの記述に誤りがあった為、修正致しました。

詳細は以下から。

OAuthとは

WebAPIのセキュアな認証を行う為のプロトコルです。TwitterではこのOAuthを使用することで、簡単でセキュアに
ユーザー情報を扱うことができるようになっています。

OAuthの詳しい概念はこちらを参照して下さい。

TwitterAPIの詳しい情報はこちらを参照して下さい。

Twitter4Jとは

Twitter4JはTwitterのWebAPIをJavaで簡単に実装できるようにしてくれる便利なライブラリです。

詳細は公式のWEBページ(http://twitter4j.org/ja/index.html)を参照して下さい。

Twitter4Jをプロジェクトに読み込む

Twitter4Jを使用する為には、プロジェクトにjarファイルを追加する必要があります。

プロジェクトに外部ライブラリをインポートする“を参考にTwitter4Jをプロジェクトに読み込んで下さい。

コールバック用Activityの作成

EclipseでAndrodプロジェクトを作成すると、メインのActivityが作成されますが、今回は初期画面の他にTwitterの
認証画面からのコールバックを受け取るActivityが必要ですので、javaソースファイル”CallBackActivity.java“を
作成して下さい。

ソースファイルではActivityの継承のみ記述を追加して下さい。

CallBackActivity.java

public class CallBackActivity extends Activity {

	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.callback);
	}

}

コールバック用のActivityが作成できたら、Twitterの認証画面から発行されるIntentを受け取る為に、以下を
AndroidManifestに追加して下さい。

AndroidManifest.xml

<activity android:name="CallBackActivity" android:label="@string/app_name"
        android:launchMode="singleInstance">
    <intent-filter>
        <action android:name="android.intent.action.VIEW" />
        <category android:name="android.intent.category.DEFAULT" />
        <category android:name="android.intent.category.BROWSABLE" />
        <data android:scheme="Callback" />
    </intent-filter>
</activity>

画面レイアウトの作成

初期画面はボタンのみのレイアウトを用意します。

初期画面のレイアウトファイル

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:orientation="vertical"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    >
    <Button android:text="Button" android:id="@+id/button1" android:layout_width="wrap_content" android:layout_height="wrap_content"></Button>
</LinearLayout>

コールバック用画面は認証情報を表示する為のTextViewのみのレイアウトを用意します。

コールバック用画面のレイアウトファイル

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout
  xmlns:android="http://schemas.android.com/apk/res/android"
  android:layout_width="fill_parent"
  android:layout_height="fill_parent">
    <TextView android:text="TextView" android:id="@+id/textView1" android:layout_width="wrap_content" android:layout_height="wrap_content"></TextView>
</LinearLayout>

パーミッションの追加

今回はブラウザを使用してTwitterで認証する為、AndroidManifestへ以下の記述を追加する必要があります。

AndroidManifest.xml

<activity android:name="CallBackActivity" android:label="@string/app_name"
            android:launchMode="singleInstance">
    <intent-filter>
        <action android:name="android.intent.action.VIEW" />
        <category android:name="android.intent.category.DEFAULT" />
        <category android:name="android.intent.category.BROWSABLE" />
        <data android:scheme="Callback" />
    </intent-filter>
</activity>

Twitterの認証ページをブラウザで開く

必要な設定や画面の用意ができた所で、処理の実装に入ります。

まずはサンプルコードから。

OauthSample.java

public class OauthSample extends Activity {

	public static RequestToken _req = null;
	public static OAuthAuthorization _oauth = null;

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);

        Button btn = (Button)findViewById(R.id.button1);
        btn.setOnClickListener(new OnClickListener() {

			@Override
			public void onClick(View v) {
				executeOauth();
			}
		});
    }

    private void executeOauth(){
    	//Twitetr4Jの設定を読み込む
    	Configuration conf = ConfigurationContext.getInstance();

    	//Oauth認証オブジェクト作成
    	_oauth = new OAuthAuthorization(conf);
		//Oauth認証オブジェクトにconsumerKeyとconsumerSecretを設定
    	_oauth.setOAuthConsumer("iy2FEHXmSXNReJ6nYQ8FRg", "KYro4jM8BHlLSMsSdTylnTcm3pYaTCiG2UZrYK1yI4");
		//アプリの認証オブジェクト作成
		try {
			_req = _oauth.getOAuthRequestToken("Callback://CallBackActivity");
		} catch (TwitterException e) {
			e.printStackTrace();
		}
		String _uri;
		_uri = _req.getAuthorizationURL();
		startActivityForResult(new Intent(Intent.ACTION_VIEW , Uri.parse(_uri)), 0);
    }
}

23行目では、TwitterのWebAPIを使用する為の情報が詰まっているConfigurationオブジェクトを作成しています。
このConfigurationオブジェクトは状況によって適時設定を書き換えることができますが、通常の用途では初期設定のままで問題ありません。

26行目ではOAuthAuthorizationオブジェクトを作成しています。
OAuthAuthorizationオブジェクトは、アプリケーションのconsumer keyとconsumer secretを設定すると、OAuth用のAccess Tokenを作成してくれるオブジェクトです。

28行目ではOAuthAuthorizationオブジェクトにアプリケーションのconsumer keyとconsumer secretを設定しています。

31行目ではOAuthAuthorizationオブジェクトを使用して、RequestTokenオブジェクトを作成しています。
RequestTokenオブジェクトは、OAuth用のURLを作成してくれるオブジェクトです。

36行目ではRequestTokenオブジェクトを使用して、OAuth用のURLを作成しています。

37行目では34行目で作成したOAuth用のURLでブラウザを起動しています。

次回予告

次回はブラウザから発行されたIntentから認証情報を取得する方法を紹介します。

この認証情報を利用することで、2回目以降にアプリを起動させた時に、認証画面を起動することなく、Twitterのアカウントを使用することが可能になります。

3 Comments