Аутентификация с помощью Google App Engine с собственного клиента Iphone - PullRequest
2 голосов
/ 19 января 2011

Я хочу создать игру для Iphone, в которой пользователи могут входить со своими учетными данными Facebook и проходить аутентификацию на моем сервере, работающем в Google App Engine.Я получил Facebook Connect, работающий как на iPhone, так и на Google App Engine.Тем не менее, похоже, что Facebook Connect для iPhone только аутентифицирует вас на сервере Facebook и позволяет вам получить доступ к API Facebook от.

Причина, по которой я хочу это сделать, заключается в том, что я могу хранить дополнительные пользовательские данные, связанныес учетной записью пользователя в GAE, но они также должны войти в систему со своими учетными данными Facebook.

Можно ли аутентифицировать пользователя с использованием его учетных данных Facebook с помощью собственного клиента iPhone, но выполнить аутентификацию на моем сервере?Кажется, что Farmville для iPhone делает что-то вроде этого.

Есть идеи, как это сделать?

Ответы [ 2 ]

1 голос
/ 05 марта 2011

Это возможно через промежуточный прокси API Facebook в вашем приложении GAE.

Просматривая некоторый код, который у меня есть, для этого я называю классические API auth.getSession с auth_token и generate_session_secret, предоставленными клиентом, и, конечно, format - это XML.

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

По сути, происходит то, что клиент входит в систему, получает токен аутентификации, передает его промежуточному прокси, который затем запрашивает у Facebook сеанс с использованием этого токена, возвращая его клиенту Connect.

0 голосов
/ 25 марта 2011

Вот прокси-сервер GAE, который вы можете вызывать из своего приложения для iphone, используя Facebook connect.

Назовите это facebookProxy или как-нибудь еще и добавьте обработчик URL на GAE.

Позвоните из приложения 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()
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...