Kii Cloudでさくっとデータベースを使用したAndroidアプリを作ろう。 ユーザー認証編

クラウドクラウド言ってるけど
実際サーバーサイド書くのめんどくさいよー!って嘆いてたら
お世話になっている方にBaaS使えばいいじゃないって
Kii Cloudというサービスを教えていただいた。

BaaSってのは要するにモバイル関連サービスにありがちな機能を
全部まとめて簡単に使えるようにしちゃったよ♪っていうものらしい。

Kii Cloudは現在はBetaで無料(?)で使用出来る&日本語のドキュメントも用意されてたので
ちょっとAndroidからいじってみた。

今回作りたいアプリでKii Cloudで使える機能は

① アカウント作成
② サインイン
③ クライアントからデータをサーバーに送信
④ Web+Androidクライアントでサーバーからデータを取得・表示
⑤ PUSH通知

結局全部できる。なんなのBaas。

①のアカウント作成と②のサインインをちゃちゃっと実装。

・まずはkii cloudに登録
・サインイン後にCreate Appで作りたいAppを作成
・Access KeysをクリックするとApp IDApp Keyが表示される

実際にコードを書くのはここからで

まずおまじないでkii cloudの初期化をする

		Kii.initialize("APP_ID", "APP_KEY", Site.JP);

App IDApp Key
Access Keyで確認した自分のアプリの値を入力しておく

ここからアカウント作成を実装

今回はよくありがちなアカウント登録>メール認証を使ってみたかったので
 ・ユーザー名
 ・メールアドレス
 ・電話番号
を入力させてメールでURLを送りつけてクリックしたら認証完了っていう流れをやってみた。

やってみたといっても全て Kii Cloudに機能としてあるので
Kii Cloudのサイトから自分のAppを選んで

Edit > Settings > Require Verification の Mail Addressにチェックを入れて [Save]

準備はこれだけ。

書くコードは公式のリファレンスガイドより


kiiUser.Bulider builder = KiiUser.builderWithName("user_123456"); 
builder.withEmail("user_123456@example.com"); 
//builder.withPhone("+819012345678"); //電話認証も出来るようです
KiiUser user3 = builder.build(); 

try { 
    user3.register("123ABC"); 
} catch (AppException e) {
    // Sign-up failed for some reasons
    // Please check AppException to see what went wrong...
} catch (IOException e) { 
    // Sign-up failed for some reasons
    // Please check IOExecption to see what went wrong...
}

たったこれだけ。

kiiUser.Buliderに builderWithNameで ユーザーに入力してもらったユーザー名を入れて
withEmailで同じようにメールアドレスを入れて
kiiuserをbuildしてregisterする時にパスワードを渡すだけ。

registerした瞬間に通信してるのでこのへんはAsyncTaskでやらないとAndroid側がエラー出す。

あとはメールがポーンと届いてるのでURLクリックすると認証出来たよ的なことが表示される。

既に登録されてたり問題があるときはjsonでエラーが返ってくるようなので別途パースしないといけないかな?

まだちゃんと調べてないので後で追記します。

サインイン

これも数行

String username = "user_123456";
String password = "123ABC";
try {
    KiiUser loginUser = KiiUser.logIn(username, password);
} catch (IOException e) {
    // Sign-in failed for some reasons
    // Please check IOExecption to see what went wrong...
} catch (AppException e) {
    // Sign-in failed for some reasons
    // Please check AppException to see what went wrong...
}

ユーザー名とパスワード入力させて

KiiUser loginUser = KiiUser.logIn(username, password);

これだけだよ…

正常にログインできてたら KiiUserのmethodでいろいろ取得したり
メールアドレス・パスワードの変更とか出来るようなので
このへんも近いうちに書いてみる。

なんともはやこれだけでアカウント作成>サインインが実装できてしまった。

もうcakePHPなんて触らなくていいんだ!!

私のようなクソグラマーでもこんなものが作れてしまうのだから
恐ろしい世の中だ… Baas恐るべし。

一応ソース残しておく。じゃじゃっと書いたので汚いのは許して。

public class MainActivity extends Activity {

	private static Task authTask;
	private static LoginTask loginTask;
	private static ProgressDialog mProgressDialog;

	EditText txt_email;
	EditText txt_password;
	EditText txt_nickname;

	EditText txt_login_email;
	EditText txt_login_password;

	Button b_make_account;
	Button b_login;

	String msg = "";

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

		Kii.initialize("APP_ID", "APP_KEY", Site.JP);

		init();

	}

	private void showDialog() {
		mProgressDialog = new ProgressDialog(this);
		mProgressDialog.setMessage("通信中");
		mProgressDialog.setIndeterminate(false);
		mProgressDialog.setProgressStyle(ProgressDialog.STYLE_SPINNER);
		mProgressDialog.setCancelable(false);
		mProgressDialog.show();
	}

	private void dismissDialog() {
		mProgressDialog.dismiss();
		mProgressDialog = null;
	}

	private void init() {

		// 定義
		txt_email = (EditText) findViewById(R.id.txt_email);
		txt_password = (EditText) findViewById(R.id.txt_password);
		txt_nickname = (EditText) findViewById(R.id.txt_nickname);

		txt_login_password = (EditText) findViewById(R.id.txt_login_password);
		txt_login_email = (EditText) findViewById(R.id.txt_login_email);

		b_make_account = (Button) findViewById(R.id.b_make_account);
		b_login = (Button) findViewById(R.id.b_login);

		b_login.setOnClickListener(new View.OnClickListener() {
			@Override
			public void onClick(View v) {
				if (txt_nickname.getText().toString().equals("")
						|| txt_email.getText().toString().equals("")
						|| txt_password.getText().toString().equals("")) {

					Toast.makeText(getBaseContext(), "すべての項目を正しく入力してください",
							Toast.LENGTH_SHORT).show();

				} else {

					postLoginDetail post_login_detail = new postLoginDetail();
					post_login_detail.setParams(txt_login_email.getText()
							.toString(), txt_password.getText().toString());

					showDialog(); // プログレスダイアログの再表示
					loginTask = new LoginTask();
					loginTask.execute(post_login_detail);

				}

			}

		});

		// イベント処理
		b_make_account.setOnClickListener(new View.OnClickListener() {
			@Override
			public void onClick(View v) {

				String ptnStr = "[\\w\\.\\-]+@(?:[\\w\\-]+\\.)+[\\w\\-]+";
				Pattern ptn = Pattern.compile(ptnStr);
				String mail = txt_email.getText().toString();
				Matcher mc = ptn.matcher(mail);

				if (txt_nickname.getText().toString().equals("")
						|| txt_email.getText().toString().equals("")
						|| txt_password.getText().toString().equals("")
						|| !mc.matches()) {

					Toast.makeText(getBaseContext(), "すべての項目を正しく入力してください",
							Toast.LENGTH_SHORT).show();

				} else {

					postMakeAccount pma = new postMakeAccount();
					pma.setParams(txt_nickname.getText().toString(), txt_email
							.getText().toString(), txt_password.getText()
							.toString());

					showDialog(); // プログレスダイアログの再表示
					authTask = new Task();
					authTask.execute(pma);

				}

			}
		});

	}

	/**
	 * Task バックグラウンド処理用のクラス
	 */
	protected class LoginTask extends
			AsyncTask<postLoginDetail, String, String> {

		@Override
		protected String doInBackground(postLoginDetail... params) {
			String str = "";

			str = login(params[0]);

			return str;
		}

		/**
		 * onPostExecute
		 * 
		 * @param String
		 *            result 通信結果 結果を受け取ったときに・・・メインスレッド
		 */
		@Override
		protected void onPostExecute(String result) {
			dismissDialog();
			Toast.makeText(getBaseContext(), result, Toast.LENGTH_SHORT).show();
		}
	}

	/**
	 * Task バックグラウンド処理用のクラス
	 */
	protected class Task extends AsyncTask<postMakeAccount, String, String> {

		@Override
		protected String doInBackground(postMakeAccount... params) {
			String str = "";

			str = makeAccount(params[0]);

			return str;
		}

		/**
		 * onPostExecute
		 * 
		 * @param String
		 *            result 通信結果 結果を受け取ったときに・・・メインスレッド
		 */
		@Override
		protected void onPostExecute(String result) {
			dismissDialog();
			Toast.makeText(getBaseContext(), result, Toast.LENGTH_SHORT).show();
		}
	}

	class postLoginDetail {

		String nickname = "";
		String password = "";

		void setParams(String n, String p) {
			nickname = n;
			password = p;
		}

		String getNickname() {
			return nickname;
		}

		String getPassword() {
			return password;
		}

	}

	class postMakeAccount {

		String nickname = "";
		String email = "";
		String password = "";

		void setParams(String n, String m, String p) {
			nickname = n;
			email = m;
			password = p;
		}

		String getNickname() {
			return nickname;
		}

		String getEmail() {
			return email;
		}

		String getPassword() {
			return password;
		}

	}

	private String login(postLoginDetail params) {

		String msg = "";

		String username = params.getNickname();
		String password = params.getPassword();

		try {
			KiiUser loginUser = KiiUser.logIn(username, password);

		} catch (IOException e) {
			// Sign-in failed for some reasons
			// Please check IOExecption to see what went wrong...
			msg = e.getMessage();

		} catch (AppException e) {
			// Sign-in failed for some reasons
			// Please check AppException to see what went wrong...
			msg = e.getMessage();

		}

		return msg;
	}

	private String makeAccount(postMakeAccount pma) {

		String msg = "";

		KiiUser.Builder builder = KiiUser.builderWithName(pma.getNickname());
		builder.withEmail(pma.getEmail());
		KiiUser user = builder.build();

		try {
			user.register(pma.getPassword());
			msg = "メールを確認しURLをクリックして認証を完了してください";
		} catch (AppException e) {
			msg = e.getMessage();
		} catch (IOException e) {
			msg = e.getMessage();
		}

		return msg;
	}

}


About the author