表題のとおりです。とりあえず 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 件のコメント:
コメントを投稿