表題のとおりです。とりあえず OAuth でログインできるところまで行きたいですね。
まずは twitter4j を追加します。これまでは jar をコピーしていたのですが、そんなことするよりずっと簡単な方法があります。Managed Dependency という項に書かれているように Build.scala に依存を書けば勝手に解決してくれます。フレームワークって大事ですね。
val appDependencies = Seq(
"org.twitter4j" % "twitter4j-core" % "3.0.3"
)
これだけ・・・。便利になりました。早速コードを書き始めると・・・おや、Play! を再起動しても IntelliJ IDEA では解決してくれないですね。うーむ。File > Invalidate Caches なんかもやってみましたがだめです。どうやら
$ play ideaを実行しないとだめみたいです。このへんはもう少し便利になってくれるとうれしいですけどね。まあこれで特に問題はないです。
では OAuth のページを作成しましょう。
と思ったらなんか便利そうなものを見つけました。 ここに書かれている SecureSocial なるものを使ってみますか。また dependency をつけます。
val appDependencies = Seq(
"org.twitter4j" % "twitter4j-core" % "3.0.3",
"securesocial" %% "securesocial" % "master-SNAPSHOT"
)
val main = play.Project(appName, appVersion, appDependencies).settings(
// Add your own project settings here
resolvers += Resolver.url("sbt-plugin-snapshots", new URL("http://repo.scala-sbt.org/scalasbt/sbt-plugin-snapshots/"))(Resolver.ivyStylePatterns)
)
この時点では Play! 2.1 には spapshot を使えとあるのでそうしてみました。これで同じように play idea も実行して解決させておきます。routes は書いてあるものそのままで。play.plugins からは不要な Provider を消します。9994:securesocial.core.DefaultAuthenticatorStore 9995:securesocial.core.DefaultIdGenerator 9997:securesocial.controllers.DefaultTemplatesPlugin 9998:service.InMemoryUserService 10000:securesocial.core.providers.TwitterProviderこんな感じで。あ、sample から InMemoryUserService を持ってきました。動作確認に使えます。次に securesocial.conf を作って application.conf から include します。
securesocial {
onLoginGoTo=/
onLogoutGoTo=/login
ssl=false
twitter {
requestTokenUrl="https://twitter.com/oauth/request_token"
accessTokenUrl="https://twitter.com/oauth/access_token"
authorizationUrl="https://twitter.com/oauth/authenticate"
consumerKey="****"
consumerSecret="****"
}
}
いよいよ実行です・・・。とその前に、ログインしてないとだめなメソッドに @SecureSocial.SecuredAction アノテーションをつけます。 @SecureSocial.SecuredAction
public static Result index() {
Identity user = (Identity) ctx().args.get(SecureSocial.USER_KEY);
final String userName = user != null ? user.fullName() : "guest";
return ok(index.render("Logged on as " + userName + "."));
}
では実行です。/login にアクセスするとまずはこのようにログインの画面が出ます。ここで t のアイコンをクリックするといつものツイッターの認証画面に飛ばされます。そこで認証を行うと
のようになります。やったー。・・・ツイッターだけだと正直楽になったかどうか微妙ですがw ほかのサービス(facebook とか)でもログインできるのでその手のサービスを作りたいときは便利なのは間違いないですね。
さてこれでログインはできましたが、twitter4j が使えなければ意味がないわけで。ログインした後に実行されるメソッドの中身を変えます。
String ret = "Unknown";
Identity user = (Identity) ctx().args.get(SecureSocial.USER_KEY);
if (user != null) {
Twitter twitter = new TwitterFactory().getInstance();
twitter.setOAuthConsumer(Play.application().configuration().getString("securesocial.twitter.consumerKey"),
Play.application().configuration().getString("securesocial.twitter.consumerSecret"));
AccessToken accessToken = new AccessToken(user.oAuth1Info().get().token(), user.oAuth1Info().get().secret());
twitter.setOAuthAccessToken(accessToken);
User u = twitter.verifyCredentials();
ret = "Logged on as " + u.getName() + "(@" + u.getScreenName() + ") followed by " + u.getFollowersCount() + " followers.";
}
return ok(index.render(ret));
実行すると・・・できたー。



0 件のコメント:
コメントを投稿