最近、プライベートを圧迫していた急ぎの仕事が一段落したので、MA7の興奮が冷めないうちにPlay Frameworkを使って何かWebサービスを制作したいと考えています。
何を作るかはまだ何も考えていないのですが、下準備としてPlay FrameworkでのOAuth認証を実装していきたいと思います。
まずはTwitterアカウントによる認証を実装します。 → サンプルページ
1.事前準備
/conf/application.conf の85行目 #db=mem のコメントアウトを解除します。
2.Twitter
TwitterアカウントによるOAuth認証を実装します。
TwitterのOAuth認証は、Playの配布物にサンプルプロジェクトが含まれているので、特に悩む所もなく、簡単に実装できました。
1)アプリケーションの登録
TwitterのMy Applicationsで、アプリケーションを登録しました。
2)User.javaの実装
ユーザーのモデルとして、以下のようなUser.javaを実装しました。
package models;
import javax.persistence.Entity;
import play.db.jpa.Model;
@Entity
public class User extends Model {
public long uid;
public String username;
public String token;
public String secret;
public User(String username) {
this.username = username;
}
public User(long u){
uid=u;
}
public static User findOrCreate(String username) {
User user = User.find("username", username).first();
if (user == null) {
user = new User(username);
}
return user;
}
public static User get(long id) {
return find("uid", id).first();
}
public static User createNew() {
long uid = (long)Math.floor(Math.random() * 10000);
User user = new User(uid);
user.create();
return user;
}
}
3)TwitterAuth.javaの実装
Twitterは、以下のとおり実装。ほぼ、サンプルプログラムのとおりです。
package controllers;
import java.util.HashMap;
import java.util.Map;
import models.User;
import org.w3c.dom.Document;
import org.w3c.dom.Element;
import play.Logger;
import play.libs.OAuth;
import play.libs.OAuth.ServiceInfo;
import play.libs.WS;
import play.mvc.Controller;
public class TwitterAuth extends Controller {
private static final ServiceInfo TWITTER = new ServiceInfo(
"http://twitter.com/oauth/request_token",
"http://twitter.com/oauth/access_token",
"http://twitter.com/oauth/authorize",
"*********************",
"*********************"
);
public static void authenticate() {
User user = getUser();
if (OAuth.isVerifierResponse()) {
OAuth.Response oauthResponse =
OAuth.service(TWITTER).retrieveAccessToken(user.token, user.secret);
if (oauthResponse.error == null) {
user.token = oauthResponse.token;
user.secret = oauthResponse.secret;
user.save();
} else {
Logger.error("Error connecting to twitter: " + oauthResponse.error);
}
Application.index();
}
OAuth twitt = OAuth.service(TWITTER);
OAuth.Response oauthResponse = twitt.retrieveRequestToken();
if (oauthResponse.error == null) {
user.token = oauthResponse.token;
user.secret = oauthResponse.secret;
user.save();
redirect(twitt.redirectUrl(oauthResponse.token));
} else {
Logger.error("Error connecting to twitter: " + oauthResponse.error);
Application.index();
}
}
public static Map<String,String> getUserInfo(){
Map<String,String> ret=new HashMap<String,String>();
String url = "http://twitter.com/statuses/user_timeline.xml";
Document info =
WS.url(url).oauth(
TWITTER, getUser().token, getUser().secret).get().getXml();
Element user=(Element)info.getElementsByTagName("user").item(0);
if(user!=null){
ret.put("auth", "twitter");
ret.put("name",
((Element)user.getElementsByTagName(
"name").item(0)).getTextContent());
ret.put("screenname",
((Element)user.getElementsByTagName(
"screen_name").item(0)).getTextContent());
ret.put("imageurl",
((Element)user.getElementsByTagName(
"profile_image_url").item(0)).getTextContent());
}
return ret;
}
public static User getUser() {
return User.findOrCreate("guest");
}
}
Related posts:
Comments:0
Trackbacks:0
- Trackback URL for this entry
- http://termat.sakura.ne.jp/java/play-framework%e3%81%a7oauth%e8%aa%8d%e8%a8%bc%e5%88%a9%e7%94%a8%e3%80%80%e3%81%9d%e3%81%ae1%ef%bc%9atwitter/trackback/?_wpnonce=078d54d358
- Listed below are links to weblogs that reference
- Play FrameworkでOAuth認証利用 その1:Twitter from TM's Workspace
