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

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

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

今回はGoogle App Engine上でOAuth認証をして,ノートブックの一覧を表示してみます。まずedamtest.zipをダウンロードして解凍した後,どこか適当なところに置いてください。

GoogleAppEngineLauncherのメニューからFile=>"Add Existing Application..."を選択して,解凍後のディレクトリを指定します。また,ポート番号を8081としてください。その後,main.pyの36-37行目 OAUTH_CONSUMER_KEYOAUTH_CONSUMER_SECRETを,取得したWebアプリケーション用キーで置き換えてください。これでGoogleAppEngineLauncherを通してデモを実行できます。ブラウザでhttp://localhost:8081を開くと,以下のような単純なトップページが表示されます。

EDAM OAuthデモ

EDAM OAuthデモ

ポート番号を8081以外にする場合は,main.pyの47行目APP_BASE_URIの番号を変更すれば良いです。また,本番環境で動かす場合は,この部分をGoogle App Engineのホスト名に変更する必要があります。

Google App Engineでは,予め必要なライブラリを全てアプリケーションディレクトリ内に置いておく必要があります。今回使用している外部ライブラリは以下の通りです。

evernoteとthriftはeverenote-api-1.19/python/lib/にあるものです。python-oauth2はOAuth認証用のライブラリ,httplib2はpython-oauth2が依存しているライブラリ,gaeutiltiesはセッション用です。

今回は説明を簡単にするためにセッションによってOAuthの情報を管理するようにしています。Googleアカウントなどに紐付けて管理というのでも良いでしょう。

では,OAuthの処理を見ていきましょう。デモ画面で"トークン取得"をクリックすると,以下のOAuthTokenHandlerクラスに処理が渡されます。

class OAuthTokenHandler(webapp.RequestHandler):
    """OAuthの認証手続き"""
    def get(self):
        ## Webアプリケーション用キーの設定
        consumer = oauth.Consumer(key=OAUTH_CONSUMER_KEY, secret=OAUTH_CONSUMER_SECRET)
        ## トークン取得後にOAuthサーバから転送してもらうURIの設定
        params = { "oauth_callback": TOKEN_CALLBACK_URI }
        ## 最初の要求作成: この段階ではトークンはなし
        request = oauth.Request.from_consumer_and_token(
            consumer, token=None, http_method="GET", http_url=TOKEN_URI, parameters=params)
        ## 署名作成
        request.sign_request(oauth.SignatureMethod_HMAC_SHA1(), consumer, None)
        ## 最初の要求
        uri = request.to_url()
        result = urlfetch.fetch(uri)
        if result.status_code != 200:
            self.redirect("/error")
            return

        ## レスポンスから仮証明(リクエストトークン)を抽出
        token = oauth.Token.from_string(result.content)
        ## OAuthサーバのユーザの認証・同意画面に飛ばす
        request = oauth.Request.from_token_and_callback(
            token=token, callback=TOKEN_CALLBACK_URI, http_url=AUTHORIZATION_URI)
        uri = request.to_url()
        self.redirect(uri)

まず,Webアプリケーション用のキーとシークレットをOAuthサーバの仮証明要求URI(以前のリクエストトークンURI)に送ります。この際にユーザ認可後にOAuthサーバからリダイレクトしたもらうURIをoauth_callbackで指定しておきます。また,OAuthのリクエストでは署名を作成して付加する必要があります。

成功するとOAuthサーバから仮証明(以前のリクエストトークンに相当)の情報が返ってきます。次に,この仮証明を使用してユーザの認証と承認をOAuthサーバに依頼するために,OAuthサーバの認証用URIにリダイレクトします。成功すると,以下のようにEvernoteの認証画面が表示されます。

OAuthログイン画面

OAuthログイン画面

ここでユーザ名・パスワードを入力すると,権限の承認画面に遷移します。EvernoteのOAuthではアプリケーションに"閲覧,作成,更新"の権限を付与することになります。

OAuth承認画面

OAuth承認画面

著者プロフィール

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

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

twitter:fumi1

URL:http://fumi.me

コメント

コメントの記入