python oauth 2.0 новый файл cookie fbsr facebook, ошибка проверки кода подтверждения - PullRequest
4 голосов
/ 28 сентября 2011

Я пытаюсь использовать новый файл cookie fbsr _ {{appID}}.

Я использую следующие функции для его анализа, но когда я пытаюсь впоследствии получить access_token, я получаю сообщение об ошибкеподтверждающий код подтверждения 'сообщение.Что-то не так с этими функциями разбора?Если нет, в чем может быть проблема?

подробнее: мне удалось войти в систему без файлов cookie, используя ссылку oauth, которая перенаправляет обратно на мой сайт с кодом в качестве параметра, поэтому это не может бытьидентификатор приложения, секрет приложения или redirect_uri.Другая причина в том, что у них разные сообщения об ошибках.

def base64_url_decode(inp):
    padding_factor = (4 - len(inp) % 4) % 4
    inp += "="*padding_factor 
    return base64.b64decode(unicode(inp).translate(dict(zip(map(ord, u'-_'), u'+/'))))

def parse_signed_request(signed_request, secret):

    l = signed_request.split('.', 2)
    encoded_sig = l[0]
    payload = l[1]

    sig = base64_url_decode(encoded_sig)
    data = json.loads(base64_url_decode(payload))

    if data.get('algorithm').upper() != 'HMAC-SHA256':
        logging.error('Unknown algorithm')
        return None
    else:
        expected_sig = hmac.new(secret, msg=payload, digestmod=hashlib.sha256).digest()

    if sig != expected_sig:
        return None
    else:
        logging.debug('valid signed request received..')
        return data

args = {}
args['client_id'] = fbapp_id
args['redirect_uri'] = site_url 
args['client_secret'] = fbapp_secret
args['code'] = code
response = urllib.urlopen('https://graph.facebook.com/oauth/access_token?'+urllib.urlencode(args))
# ... here i'm getting the error back from the server: error validating verification code...

Ответы [ 2 ]

10 голосов
/ 29 сентября 2011

Здесь есть модифицированная версия facebook python SDK, которая поддерживает OAuth 2.0 и парсинг файла cookie fbsr_ на github:

https://gist.github.com/1190267

Вы можете заглянуть в код, чтобы узнать, как анализировать cookie-файл, или просто позволить этому файлу сделать всю работу за вас.

0 голосов
/ 24 ноября 2011

Мне пришлось програматически истечь cookie для моего выхода из системы на работу.Ссылка с Facebook не работает, но сервер oauth может выполнить выход без JavaScript:

class LogoutHandler(webapp2.RequestHandler):
    def get(self):
        self.set_cookie("fbsr_" + facebookconf.FACEBOOK_APP_ID, None, expires=time.time() - 86400)
        self.redirect("/")
    def set_cookie(self, name, value, expires=None):

        if value is None:
            value = 'deleted'
            expires = datetime.timedelta(minutes=-50000)
        jar = Cookie.SimpleCookie()
        jar[name] = value
        jar[name]['path'] = '/'
        if expires:
            if isinstance(expires, datetime.timedelta):
                expires = datetime.datetime.now() + expires
            if isinstance(expires, datetime.datetime):
                expires = expires.strftime('%a, %d %b %Y %H:%M:%S')
            jar[name]['expires'] = expires
        self.response.headers.add_header(*jar.output().split(': ', 1))

Не могли бы вы обновить свой вопрос, чтобы сообщить нам, как он прошел и как мы обращаемся с файлами cookie.Для клятвы facebook, вы получили выход на работу?Мне пришлось добавить обработку cookie и обработчик выхода из системы, чтобы это работало для меня, но теперь, после долгих проблем, оно работает.Я захожу так:

class OAuthHandler(I18NHandler):
    def get(self):
      args = dict(
        code = self.request.get('code'),
        client_id = facebookconf.FACEBOOK_APP_ID,
        client_secret = facebookconf.FACEBOOK_APP_SECRET,
        redirect_uri = 'http://www.koolbusiness.com/oauth',
      )
      file = urllib.urlopen("https://graph.facebook.com/oauth/access_token?" + urllib.urlencode(args))
      try:
        token_response = file.read()
      finally:
        file.close()
      access_token = cgi.parse_qs(token_response)["access_token"][-1]
      graph = main.GraphAPI(access_token)
      user = graph.get_object("me")   
      self.response.out.write(user["id"])
      self.response.out.write(user["name"])


def get(self):
    fbuser=None
    profile = None
    access_token = None
    accessed_token = None
    if self.request.get('code'):
      args = dict(
        code = self.request.get('code'),
        client_id = facebookconf.FACEBOOK_APP_ID,
        client_secret = facebookconf.FACEBOOK_APP_SECRET,
        redirect_uri = 'http://'+self.get_host()+'/',
      )
      logging.debug("client_id"+str(args))
      file = urllib.urlopen("https://graph.facebook.com/oauth/access_token?" + urllib.urlencode(args))
      try:
        logging.debug("reading file")
        token_response = file.read()
        logging.debug("read file"+str(token_response))
      finally:
        file.close()
      access_token = cgi.parse_qs(token_response)["access_token"][-1]
      graph = main.GraphAPI(access_token)
      user = graph.get_object("me")   #write the access_token to the datastore
      fbuser = main.FBUser.get_by_key_name(user["id"])
      logging.debug("fbuser "+fbuser.name)

      if not fbuser:
        fbuser = main.FBUser(key_name=str(user["id"]),
                            id=str(user["id"]),
                            name=user["name"],
                            profile_url=user["link"],
                            access_token=access_token)
        fbuser.put()
      elif fbuser.access_token != access_token:
        fbuser.access_token = access_token
        fbuser.put()

    current_user = main.get_user_from_cookie(self.request.cookies, facebookconf.FACEBOOK_APP_ID, facebookconf.FACEBOOK_APP_SECRET)
    if current_user:
      graph = main.GraphAPI(current_user["access_token"])
      profile = graph.get_object("me")
      accessed_token = current_user["access_token"]
...