前回、アプリの作り方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などをコールすることができるようになります。
取得するまで時間がかかりましたが、こうして処理をテンプレにしておくと、後で、振り返ることができるので、便利かなと。
Tweet
0 コメント:
コメントを投稿