2

ユーザーがFacebookの認証情報でログインし、Google App Engine上で動作しているサーバーで認証できるIphoneゲームを作成します。私はiPhoneとGoogle App Engineの両方でFacebookに接続しています。しかし、FacebookのiPhone接続は、Facebookのサーバーであなたを認証し、FacebookのApiにアクセスできるようにするだけのようです。iphoneネイティブクライアントからGoogle App Engineで認証する

私がこれをやりたい理由は、ユーザーアカウントに関連付けられた余分なユーザーデータをGAEに保存できるようにすることですが、Facebookの資格情報でログインさせることもできます。

iPhoneネイティブクライアントを使用して自分のFacebook資格情報を使用してユーザーを認証できますが、自分のサーバーで認証できますか? iPhoneのFarmvilleのようなものだと思う。

これはどのような考えですか?

答えて

1

これは、GAEアプリの中間Facebook APIプロキシ経由で可能です。私はそれがこれを行う必要があり、いくつかのコードをスキミング

は、私は古典的なAPIのauth.getSessionauth_tokenと、クライアントによって提供さgenerate_session_secretとを呼び出し、そしてもちろんformatXMLです。

http://developers.facebook.com/docs/reference/rest/auth.getSession/

基本的に何が起こるかは、クライアントがログインすることで、[接続クライアントにそれを返す、そのトークンを使用してセッションのためのFacebookを要求する中間プロキシへの投稿、認証トークンを取得します。

+0

これで、ユーザーがサーバー上でセッションを確立した後に、サーバーに対する今後のすべての要求をどのように認証しますか? –

0

Facebook Connectを使用してiphoneアプリから呼び出せるGAEプロキシがあります。

facebookProxyなどと呼び、GAEでURLハンドラを追加します。

使用してiPhoneアプリの中からそれを呼び出します。

session = [FBSession sessionForApplication:myApiKey getSessionProxy:@"http://yourApp.appspot.com/facebookProxy" delegate:self];

をここでは、プロキシのためのPythonコードです。私は別の定数ファイルを使用してFacebookのアプリのキーを保存するので、それを変更する必要があります。

import cgi 
import hashlib 
import httplib 
import urllib 
import logging 
from google.appengine.ext.webapp.util import run_wsgi_app 
from google.appengine.ext import webapp 
from google.appengine.api import users 
import Constants 

FB_API_HOST="api.facebook.com" 
FB_API_PATH="/restserver.php" 

def facebook_signature(paramsDict): 
    """Compute the signature of a Facebook request""" 
    sorted = paramsDict.items() 
    sorted.sort() 

    trace = ''.join(["%s=%s" % x for x in sorted]) 
    trace += Constants.FB_API_SECRET() 

    md5 = hashlib.md5() 
    md5.update(trace) 
    return md5.hexdigest() 

def get_fb_session(auth_token): 
    """Request a Facebook session using the given auth_token""" 
    params={ 
      "api_key":Constants.FB_API_KEY, 
      "v":"1.0", 
      "auth_token":auth_token, 
      "generate_session_secret":"1", 
      "method":"auth.getSession", 
    } 
    params["sig"] = facebook_signature(params) 

    encoded_params = urllib.urlencode(params) 
    headers = { 
      "Content-type":"application/x-www-form-urlencoded", 
    } 

    conn = httplib.HTTPConnection(FB_API_HOST) 
    conn.request("POST", FB_API_PATH, encoded_params, headers) 
    logging.debug("%s" % encoded_params) 
    return conn.getresponse() 

class FacebookSessionProxy(webapp.RequestHandler): 
    def get(self): 
     response = self.response 
     auth_token = self.request.get('auth_token') 
     logging.debug("AUTH TOKEN: %s" % auth_token) 
     if len(auth_token) == 0: 
      response.set_status(httplib.BAD_REQUEST) 
      response.out.write("Facebook login error: no auth_token given.") 
      return 
     fbResponse = get_fb_session(auth_token) 
     response.out.write(fbResponse.read()) 
     response.set_status(fbResponse.status, fbResponse.reason) 
     response.headers['Content-Type'] = fbResponse.getheader('content-type') 

# The End 

application = webapp.WSGIApplication(
            [ 
             ('/facebookproxy', FacebookSessionProxy), 
            ], 
            debug=True) 

def main(): 
    logging.getLogger().setLevel(logging.DEBUG) 
    run_wsgi_app(application) 

if __name__ == "__main__": 
    main() 
関連する問題