dispatch で はてなの OAuth認証を使う
dispatch で はてなの OAuth認証を使う
今回も dispatch 使っての OAuth ねたです。
こんどは hatena API にアクセスする際の OAuth 認証の部分を dispatch をつかって認証する方法です。
はてなの OAuth API
はてな の OAuth API については はてなのAPIのページこちら を参照してください。
はじめに
- アプリケーションの登録
- Consumer key の確認
が必要です。
Request token の取得
認証用 URLにアクセスするために必要な Request token を取得する部分です。 ここでは 取得した Consumer key が必要です。 また はてな のOAuth の場合 scope もパラメータも指定する必要があります。
val consumer = new Consumer("取得したKEY", "取得したシークレットKEY") val http = new Http val u = (:/("www.hatena.com") / "oauth" ).secure // token を取得 val request_token = http(u / "initiate" << Map("scope" -> "read_public") <@ (consumer,"oob") as_token)
scope パラメータの指定の為に Map("scope" -> "read_public") を <<
を使って追加します。
<<
は POSTメソッドで送信するパラメータを追加します。
dispatch の OAuth.scala をみると sign 関数の中で form_params と query_params を
ユーザパラメータとして設定しているようです。
<@
は送信するリクエストを設定します。
今回は consumer key と 第二引数のcallback 関数の引数に oob を指定しています。
oob を指定すると oauth_verifier の値をユーザに表示させることができます。
verifier の取得
verifier の値を表示する為に ブラウザでアクセスするURL
// verifier を取得する URLを表示、このURLにブラウザでアクセスして 値を確認する。 val vrfyurl = (u / "authorize" <<? Map("oauth_token" -> request_token.value)).to_uri
下の こんなURLにブラウザでアクセスすると Verifier の値が表示されます。
https://www.hatena.ne.jp/oauth/authorize?oauth_token=QB%2FfqbXTpFB1GQ%3D%3D
というURL形式となりますので、<<?
をつかって 取得したrequest token の値を oauth_token として指定しています。
ブラウザで URLにアクセスすると verifier の値が表示されます。
access_token の取得
access_token を取得するには 取得したverifier の値 と 最初に取得した request token を使います。
取得した verifier の値を oauth_verifier として送信するのですが、
dispatch の場合これも
<@ (consumer: Consumer, token: Token, verifier: String)
と <@
をつかって指定できます。
// verifier を使って access_token を取得する val access_token = http(u / "token" <@ (consumer, request_token, authverify) as_token)
authverify に 取得した verifier の値を入れ トークンを取得します。
access_token を使って API アクセス
実際に 取得した access_token を使って APIにアクセスするには
<@ (consumer: Consumer, token: Token)
で取得した access token を指定してあくせすするだけです。
// 取得した access_token を使ってAPIにアクセス val result = http(url("http://n.hatena.com/applications/my.json") <@ (consumer, access_token) as_str)
dispatch 使うとOAuthの認証使っているAPIも簡単に扱えます。
ソース
使用したバージョン
- scala 2.9.2
- dispatch 0.8.9
build.sbt
scalaVersion := "2.9.2" libraryDependencies ++= Seq( "net.databinder" %% "dispatch-http" % "0.8.9", "net.databinder" %% "dispatch-oauth" % "0.8.9" )
hatena_oauth.scala
import dispatch.classic._ import oauth._ import OAuth._ val consumer = new Consumer("xxxxxxxxxxxx", "xxxxxxxxxxxxxxxxxxxx") val http = new Http val u = (:/("www.hatena.com") / "oauth" ).secure // token を取得 val request_token = http(u / "initiate" << Map("scope" -> "read_public") <@ (consumer,"oob") as_token) // verifier を取得する URLを表示、このURLにブラウザでアクセスして 値を確認する。 val vrfyurl = (u / "authorize" <<? Map("oauth_token" -> request_token.value)).to_uri println("Get veifier value from this url: " + vrfyurl) val authverify:String = readLine("Please Input Verify Value: ") println("value = " + authverify) // verifier を使って access_token を取得する val access_token = http(u / "token" <@ (consumer, request_token, authverify) as_token) println("access_token: " + access_token.value) println("access_token_secret: " + access_token.secret) // 取得した access_token を使ってAPIにアクセス val result = http(url("http://n.hatena.com/applications/my.json") <@ (consumer, access_token) as_str)