[公式]Evernote API徹底活用レシピ

第12回 Google App Engine上でOAuth認証を行う

この記事を読むのに必要な時間:およそ 3 分

ユーザが承認した場合は,仮証明取得時にoauth_callbackに指定したURIに転送されてきます。そのURIの処理はOAuthTokenCallbakHandlerクラスで行っています。

class OAuthTokenCallbackHandler(webapp.RequestHandler):
    """OAuthから戻ってきた後の処理"""
    def get(self):
        session = sessions.Session()
	## ユーザが承認した場合はoauth_tokenとoauth_verifierが返ってくる
        oauth_token = self.request.get("oauth_token")
        oauth_verifier = self.request.get("oauth_verifier")
        ## シークレットは使用しないので空で良い
        token = oauth.Token(oauth_token, "")
        ## oauth_verifierは必須
        token.set_verifier(oauth_verifier)

        ## トークン証明(アクセストークン)の取得
        consumer = oauth.Consumer(key=OAUTH_CONSUMER_KEY, secret=OAUTH_CONSUMER_SECRET)
        client = oauth.Client(consumer, token)
        ## oauth.SignatureMethod_HMAC_SHA1()では動かない (要確認?)
        client.set_signature_method(oauth.SignatureMethod_PLAINTEXT())
        response, content = client.request(TOKEN_URI)
        if response.status != 200:
            self.redirect("/error")
            return

        ## トークン証明(アクセストークン)などの抽出
        ## NoteStoreにアクセスするのに必要なのでセッションとして保持
        params = parse_qs(content)
        session["oauth_token"] = params["oauth_token"][0]
        session["edam_shard"] = params["edam_shard"][0]
        session["edam_userId"] = params["edam_userId"][0]
        self.redirect("/")

ユーザ承認済の仮証明 oauth_token とチェックコード oauth_verifier が転送時に渡されてくるので,次にこれらを使用してトークン証明(以前のアクセストークンに相当)を取得します。成功するとトークン証明 oauth_tokenと,NoteStoreのURIを決定するための edam_shard,認証したユーザのIDである edam_userId が返ってきますので,それぞれセッションに保存しておきます。

トークン証明の取得が終わったら一度トップページに飛ぶようにしています。トークン証明が正常に保存されている場合は,トップページに"ノートブック一覧"というリンクが増えているはずです。

承認後のトップページ

承認後のトップページ

ノートブック一覧の処理は以下のListHandlerクラスで行っています。

class ListHandler(webapp.RequestHandler):
    """ノートブックの一覧を表示"""
    def get(self):
        session = sessions.Session()
        ## 必要なデータがセッション内にあることを確認
        for key in ["oauth_token", "edam_shard", "edam_userId"]:
            if key not in session or session[key] == "":
                sys.stderr.write('OAuth認証を先に行う必要があります。\n')
                self.redirect("/error")
                return

        ## NoteStoreからnotebooksを取得
        notestore_uri =  NOTESTORE_BASE_URI + session["edam_shard"]
        notestore_http_client = THttpClient.THttpClient(notestore_uri)
        notestore_protocol = TBinaryProtocol.TBinaryProtocol(notestore_http_client)
        notestore = NoteStore.Client(notestore_protocol)
        notebooks = notestore.listNotebooks(session["oauth_token"])
        self.response.out.write('<html><head><title>ノートブック一覧</title></head>')
        self.response.out.write('<body><h1>ノートブック一覧</h1>')
        self.response.out.write('<p>%d個のノートブック</p><ul>' % len(notebooks))
        for notebook in notebooks:
            self.response.out.write('<li>%s</li>' % notebook.name)
        self.response.out.write('</ul><p><a href="/">トップページに戻る</a></p></body></html>')

Evernoteにおいては,OAuthのトークン証明はUserStoreの認証トークンと同等です。そのため,NoteStoreを使用した処理はこれまでとまったく同じです。成功すると以下のように認証したユーザのノートブック一覧が表示されます。

ノートブック一覧

ノートブック一覧

今回はGoogle App Engine上においてOAuth認証経由でのEvernote APIの使い方を説明しました。次回も引き続きGoogle App Engineでの開発を解説します。

著者プロフィール

加藤文彦(かとうふみひろ)

国立情報学研究所新領域融合研究センター特任研究員。普段はWebの研究に従事しており,Web上のデータを型付リンクで繋いでいくLinked Dataがトレンドになると信じて日々活動している。LinkedData.jp主宰。

twitter:fumi1

URL:http://fumi.me