<< 猫ページ | Home | NetWalker買った。 >>
PR: 転職    お墓    エコ    通販    結婚相談所    シルバー    質屋    葬式    漫画    エステサロン   

Androidから、Google App Engineにログインする。

ちょっと、GAEにAndroidから接続する方法を探ってみた。目的は、Googleアカウントにログインすること。まずは、GAEの登録。ケータイのIDが必要ってことらしい。HT-03Aで登録しようとしたら、docomoのIDを聞かれる。何それ? なんか自分で申請しないといけないらしい。申請したら、あとで郵送で来るってんで、待ちきれないんで、Softbankのケータイでさくっと登録。

でまぁ、巷にあふれてるサイトを見ながら、EclipseにGAEのプラグイン入れて、テストサイトを作成。GAEでは、簡単にGoogleアカウントへのログイン機能が組み込める。コードは、こんな感じ。

@SuppressWarnings("serial")
public class TestServlet extends HttpServlet {
public void doGet(HttpServletRequest req, HttpServletResponse resp) throws IOException {
String thisURL = req.getRequestURI();
resp.setContentType("text/html");
UserService userService = UserServiceFactory.getUserService();
PrintWriter pw = resp.getWriter();
if (req.getUserPrincipal() == null) {
pw.println("<a href=\"" + userService.createLoginURL(thisURL) + "\">Login</a>");
}
else {
User user = userService.getCurrentUser();
pw.println("<a href=\"" + userService.createLogoutURL(thisURL) + "\">Logout</a><br/>");
pw.println("name = " + req.getUserPrincipal().getName() + "<br/>");
pw.println("isAdmin = " + userService.isUserAdmin() + "<br/>");
pw.println("domain = " + user.getAuthDomain() + "<br/>");
pw.println("email = " + user.getEmail() + "<br/>");
pw.println("nickname = " + user.getNickname() + "<br/>");
}
}
}

これをdeployして、アクセスすると、loginってリンクが表示されて、

それをクリックすると、おなじみのログイン画面となる。

ログインすると、自動的に自分のページに移動して、以下のようになる。この移動先は、コード中で、thisURLに保存しておいた場所だ。

さて、GAE側はよし。次は、Androidのアプリケーション内から、このサイトにloginしたい。色々といじった感じでは、こんな風にすれば良さそうだ。まずログイン。

DefaultHttpClient httpClient = new DefaultHttpClient();

List<NameValuePair> nvps = new ArrayList<NameValuePair>();
nvps.add(new BasicNameValuePair("Email", "xxx@gmail.com"));
nvps.add(new BasicNameValuePair("Passwd", "yyyy"));
nvps.add(new BasicNameValuePair("service", "ah"));
nvps.add(new BasicNameValuePair("source", "unoruimo"));
nvps.add(new BasicNameValuePair("accountType", "HOSTED_OR_GOOGLE"));

//Login at Google.com
HttpPost httpost = new HttpPost("https://www.google.com/accounts/ClientLogin");
httpost.setEntity(new UrlEncodedFormEntity(nvps, HTTP.UTF_8));
HttpResponse response = httpClient.execute(httpost);
Log.i(TAG, "Login Response: " + response.getStatusLine());

NameValuePairのListを作ってログイン情報を渡す。serviceには、"ah"これが、Googleのappspotのことらしい。sourceは、自分のアプリケーション名。URL http://unoruimo.appspot.com/test のappspotの前の部分。次にレスポンスの中から、auth=というのを見つける。

String authKey = null;
BufferedReader br = null;
try {
br = new BufferedReader(new InputStreamReader(response.getEntity().getContent()));
String line = null;
while ((line = br.readLine()) != null) {
String[] s = line.split("=");
if (s.length == 2 && s[0].equalsIgnoreCase("auth")) {
authKey = s[1];
break;
}
}
}
finally {
if (br != null) try {br.close();} catch (IOException e) {
Log.e(TAG, "Cannot close stream.", e);
}
}
Log.i(TAG, "AUTH = " + authKey);

これがトークンで、以後は、このトークンを渡してやれば、サービスを使用できるようだ。http://unoruimo.appspot.com/testをGETしたければ、以下のようにする。

HttpGet httpget = new HttpGet("http://unoruimo.appspot.com/_ah/login?auth=" + authKey + "&continue=" + "/test");
response = httpClient.execute(httpget);
InputStream is = response.getEntity().getContent();
BufferedReader isr = null;
try {
isr = new BufferedReader(new InputStreamReader(is));
String line = null;
while ((line = isr.readLine()) != null) {
Log.i(TAG, "RESPONSE: " + line);
}
}
finally {
if (isr != null) isr.close();
}

Log.i(TAG, "Appspot.com Login Response: " + response.getStatusLine());

/_ah/loginに対し、auth=で、トークンを、continue=でアクセスしたいリソースを指定する。これでうまくいったけど、資料によると、CAPCHAを要求されることもあるらしい。

で、このユーザとパスワードというのが微妙。Googleアカウントのユーザ、パスワードを、得体の知れないアプリケーションに入力するのは、抵抗あるよねぇ。本当はAndroid側に、認証サービスがあって、アプリケーション側からは、アプリケーション名を指定して、そのAPIを呼ぶと、そっちで認証してトークンを返して欲しいところだけど、どうも、今のところは、そういうサービスは無い模様。でも仮に、標準の認証サービスがあったとしても、それを真似した画面を悪意のあるアプリケーションが表示しているかもしれないし、どうするのがいいのかね。




このサイトの掲載内容は私自身の見解であり、必ずしもIBMの立場、戦略、意見を代表するものではありません。
日本アイ・ビー・エム 花井 志生 Since 1997.6.8