Authenticate pocket api with sinatra 1

PocketのAPIをたたくためにRubyのSinatraでOath認証するところを試してみた。 PocketのDeveloper APIページのPocket Authentication API Documentationのところに認証方法が書いてある。

以下、ドキュメントにそって試していく。 ####[ガイドライン] はじめから読んでいくとまずはガイドラインがあり以下が決まっているとのことだ。

####Step 1: Consumer Keyを入手する ステップ1はOauthで認証するために必要なconsumer keyを取得する必要があると書かれているので、Create a New Appから自分用のKeyを申請し取得する。
ここでは、とりあえずTest AppというApplication Nameで申請することにする。
Permissionは Retrieveのみにチェックをいれて、PlatformsはWebを選んだ。
そうするとMy Appsのところにさっき作ったTest Appがてきてて、Consumer Keyが表示されるのでメモして置く。    ####Step 2: リクエストトークンの入手 準備が整ったのでOauthでの承認プロセスを始めるわけだが、Consumer Keyと一緒にリクエストトークンが必要になるので以下のリンクからゲットせよとある。 https://getpocket.com/v3/oauth/request このURLにPostでアクセスをするとリクエストトークンがもらえるらしい。 アクセスをする際に、consumer_keyredirect_uriの2つのパラメータを指定しなさいとの事だ。

ではここから、RubyのSinatraを使ってこのステップ2を試してみる。 まずはSinatra用のファイルを作成し、簡易Webサーバを準備をする。

require 'sinatra'
require 'net/http'

configure do 
  enable :sessions
end

get '/' do 
  '<a href="/connect">Connect to the Pocket</a>'
end

今回は’Net/http’を使ってHTTPリクエストを行う。 OauthやPocket用のGemはいっぱいあるようだが、勉強のため標準ライブラリを使用することにした。 実際Gemのpocket-rubyはConsumerKeyを設定するだけで使いやすいMethodが準備されているのでAPIを叩くところまで簡単に行けるのですが、いまいちOauthの仕組みが理解できなかったのでGemは使用しないことにした。 とりあえず、ルーティングは簡単にOauthを開始するためのリンクだけを設定する。

最初のConfigureのところは、Httpで接続したセッションの情報を格納しておくための設定で、このセッションにリクエストトークンなどを保存することになる。

get '/connect' do 
uri = URI('https://getpocket.com/v3/oauth/request')
req = Net::HTTP::Post.new(uri)
req.set_form_data('consumer_key' => 'your consumer key here', 'redirect_uri' => 'http://localhost:4567/oauth')

res = Net::HTTP.start(uri.hostname, uri.port, :use_ssl => uri.scheme == 'https') do |http|
      http.request(req)
      end
result = Hash[URI.decode_www_form(res.body)]
session[:code] = result['code'] 

ルートのリンクConnect to the Pocketをクリックすると、リクエストトークを入手するURIにPostのアクセスを行います。set_form_dataでパラメータを指定し自分のconsumer keyとリダイレクトURIを記載します。redirect_uriは次のステップ3で使用するアドレスになります。(ここでは/oauthにしています) Net::HTTP.startでリクエストを送るとResponseとしてcode=dcba4321-dcba-4321-dcba-4321dcのようなリクエストトークンが帰ってきます。 リクエストトークンではなくCodeという名前で帰ってきますので、この値だけをSessionに保存してステップ2は完了。

続きは次回。