2011/02/20

[facebook][GoogleAppEngine]アプリの作り方その2

前回、アプリの作り方Hello Worldというタイトルで、facebook上にアプリをのっける方法を書きましたが、実は、あれでは、IDを取得できていないことがわかりました。

なので、今日は、その修正版のプログラムを紹介


#!/usr/bin/env python
#
# Copyright 2007 Google Inc.
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.
#
import os
import urllib
import base64

from google.appengine.ext import webapp
from google.appengine.ext.webapp import util

#django
from google.appengine.dist import use_library
use_library('django', '1.0')
from django.utils import simplejson
from google.appengine.ext.webapp import template

class MainHandler(webapp.RequestHandler):
def get(self):
__error = self.request.get('error')
if __error:
#redirect facebook
self.redirect("http://www.facebook.com/",permanent=True)
else:
self.redirect("http://apps.facebook.com/test/")

def post(self):
f_app_id = "●●●●●●"

redirect_url = "http://hoge.appspot.com/test/"
redirect_url = redirect_url.encode('utf-8')

auth_url = "https://www.facebook.com/dialog/oauth?client_id=" + f_app_id
auth_url = auth_url + "&redirect_uri=" + urllib.quote_plus(redirect_url)
auth_url = auth_url + "&scope=offline_access"

signed_request = self.request.get('signed_request')

sig, payload = signed_request.split('.', 1)
sig = self.base64_url_decode(sig)
query = simplejson.loads(self.base64_url_decode(payload))

#not logined
if not query.has_key("user_id"):
self.response.out.write("<script>top.location.href='")
self.response.out.write(auth_url)
self.response.out.write("</script>")
#already auth and load index.html
else:
template_values = {
'user_id':query["user_id"] ,
'oauth_token': query["oauth_token"]
}
path = os.path.join(os.path.dirname(__file__), 'index.html')
self.response.out.write(template.render(path, template_values))

def base64_url_decode(self,data):
sdata = data.encode('ascii')
sdata += '=' * (4 - (len(sdata) % 4))
return base64.urlsafe_b64decode(sdata)

def main():
application = webapp.WSGIApplication(
[('/test/', MainHandler)],
debug=True
)
util.run_wsgi_app(application)

if __name__ == '__main__':
main()


こうすることによって、エラーの場合と、アプリの承認と両方対応することができます。

処理の流れとして、最初に、MainHandlerのpostメソッドがコールされます。
で、facebookサーバーから送られてくるsigned_request の中に、user_idが存在しない場合は、auth_url変数に設定されているURLにリダイレクトします。

リダイレクト後、アプリを承認するかどうかの確認画面が表示されます。

もし、この段階で、否認を選択した場合に、MainHandlerクラスのgetメソッドがコールされます。
その際に、error変数をfacebookサーバーが送信してくるので、この値をもって、否認されることが確認できます。

ない場合は、承認されたことになるので、もう一度、自分にリダイレクトを行います。
で、リダイレクトされたときには、user_idが付与されているので、それを使って、GraphApiなどをコールすることができるようになります。

取得するまで時間がかかりましたが、こうして処理をテンプレにしておくと、後で、振り返ることができるので、便利かなと。

0 コメント:

コメントを投稿