Takuya71 のぶろぐ

外資系ソフトウェア会社で働いてます、認定スクラムマスター

dispatch で はてなの OAuth認証を使う

dispatch で はてなの OAuth認証を使う

今回も dispatch 使っての OAuth ねたです。
こんどは hatena API にアクセスする際の OAuth 認証の部分を dispatch をつかって認証する方法です。

はてなの OAuth API

はてな の OAuth API については はてなのAPIのページこちら を参照してください。

はじめに

  1. アプリケーションの登録
  2. 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 の値が表示されます。

f:id:takuya71:20121231002636p:plain

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)

gist