GAEでOAuthというかTwitter認証してみた。
結構てこずりましたが、Google App Engine for Pythonで
OAuth認証というかTwitter認証をしてみました。
Softbankの夏モデル携帯でTwitterが機能の一つとして入っているものが発表され、
これからTwitterの人口はどんどん増えるはずなので、
OpenIDみたいな統合認証のようにOAuthを使えたらなぁという思いでコーディングしてみました。
元ネタはサンプルコードで分かるGAE&Twitter API開発。 その節はお世話になりました。
oauth.py, simple_cookie.pyなどは上記のリンク先から取得してください。
verify後にリロードするとバグっていたので、self.redirect('/')で直しました。
#!/usr/bin/env python # -*- coding:utf-8 -*- __author__ = "Hironori Watanabe" import time import datetime import logging import os import oauth import wsgiref.handlers from google.appengine.ext import webapp from google.appengine.ext.webapp import util from google.appengine.ext.webapp import template from simple_cookie import Cookies from google.appengine.ext import db _DEBUG = True INDEX_TEMPLATE_NAME = 'index.html' LOGIN_TEMPLATE_NAME = 'login.html' HOME_TEMPLATE_NAME = 'home.html' # twitterのconsumer_keyとconsumer_secret_keyを指定 CONSUMER_KEY = "xxxxx自分のコンシューマキーを入れてねxxxxx" CONSUMER_SECRET_KEY = "xxxx自分のシークレットキーを入れてねxxxxx" # cookieの有効時間(秒)お好きにどうぞ。 COOKIE_EXPIRE_TIME = 300 class Testmodel(db.Model): id = db.StringProperty(required=True) username = db.StringProperty() class BaseRequestHandler(webapp.RequestHandler): """ Common template generation function. When you call generate(), we augment the template variables supplied with the current user in the 'user' variable and the current webapp request in the 'request' variable. """ def generate(self, template_name, template_values={}): values = { 'request': self.request, 'application_name': 'Appname', } values.update(template_values) directory = os.path.dirname(__file__) path = os.path.join(directory, os.path.join('templates', template_name)) self.response.out.write(template.render(path, values, debug=_DEBUG)) class MainHandler(BaseRequestHandler): def get(self, mode=""): """ TwitterClient, cookieクラスの作成""" (client, cookie) = createClientAndCookie(self) if mode == "login": self.redirect(client.get_authorization_url()) return if mode == "logout": ClearCookie(self, cookie) self.generate(INDEX_TEMPLATE_NAME, {}) return """ Twitterの認証後 """ if mode == "verify": VerifyAuth(self, client, cookie) query = Testmodel.all() query.filter("id =", cookie["user_token"]) tests = query.fetch(1) if not tests: test = Testmodel(id=cookie["user_token"]) test.username = cookie["screen_name"] test.put() self.generate(HOME_TEMPLATE_NAME, {'username':test.username}) self.redirect('/') return else: for test in tests: username = test.username self.generate(HOME_TEMPLATE_NAME, {'username':username}) self.redirect('/') return """ 通常(認証チェック) """ if checkUserInfo(self): tests_query = Testmodel.all() tests_query.filter("id =", cookie["user_token"]) tests = tests_query.fetch(1) for test in tests: username = test.username self.generate(HOME_TEMPLATE_NAME, {'username':username}) return else: self.generate(LOGIN_TEMPLATE_NAME, {}) return def post(self, mode=""): pass """ 共通処理 Twitter APIを利用するTwitterClientクラス(oauth.py)と ユーザー情報を保存するCookiesクラス(simple_cookie.py)を作成する """ def createClientAndCookie(self): callback_url = "%s/verify" % self.request.host_url client = oauth.TwitterClient(CONSUMER_KEY, CONSUMER_SECRET_KEY, callback_url) """Cookiesクラスの作成""" cookie = Cookies(self, max_age=COOKIE_EXPIRE_TIME) return client, cookie def checkUserInfo(self): cookie = Cookies(self, max_age=COOKIE_EXPIRE_TIME) if cookie.has_key("user_token") and cookie.has_key("user_secret") and cookie.has_key("screen_name"): return True else: return False def VerifyAuth(self, client, cookie): auth_token = self.request.get("oauth_token") auth_verifier = self.request.get("oauth_verifier") user_info = client.get_user_info(auth_token, auth_verifier=auth_verifier) cookie["user_token"] = user_info["token"] cookie["user_secret"] = user_info["secret"] cookie["screen_name"] = user_info["username"] def main(): application = webapp.WSGIApplication([ ('/(.*)', MainHandler)], debug = _DEBUG) wsgiref.handlers.CGIHandler().run(application) if __name__ == '__main__': main()
コメント
コメントを投稿