【问题标题】:Where is the access token in the URL that Facebook returns?Facebook 返回的 URL 中的访问令牌在哪里?
【发布时间】:2012-07-18 05:09:51
【问题描述】:

我请求为我的 Django 应用程序向 Facebook 验证服务器端。

def authenticateViaFacebook(request):                   
  '''
  Redirects users to a page that allows for Facebook login.
  '''
  consumer = oauth2.Consumer(
      key = settings.FACEBOOK_APP_ID,
      secret = settings.FACEBOOK_APP_SECRET)

  # Request token URL for Facebook.
  request_token_url = "https://www.facebook.com/dialog/oauth/"

  # Create client.
  client = oauth2.Client(consumer)

  # Other arguments to Facebook.
  otherArguments = 'client_id=' + settings.FACEBOOK_APP_ID
  otherArguments += '&scope=email'
  otherArguments += '&redirect_uri=' + settings.SITE_URL
  otherArguments += 'authenticationRedirect/facebook'
  otherArguments += '&secret=' + settings.FACEBOOK_APP_SECRET


  # The OAuth Client request works just like httplib2 for the most part.
  res, content = client.request(request_token_url, "GET", otherArguments)

  # Examine the response.
  return HttpResponse(str(res))

我收到了 Facebook 的回复。

{'status': '200', 'content-length': '15753', 'x-xss-protection': '0', 
 'content-location': u'https://www.facebook.com/dialog/oauth/?oauth_body_hash=1YZMc0vtMcUa5nO81ZkuwoCSct4%3D&oauth_nonce=14826580&oauth_timestamp=1342669603&oauth_consumer_key=117889941688718&oauth_signature_method=HMAC-SHA1&oauth_version=1.0&oauth_signature=t2cIAmQYs4r5IqcsoODqorFIHbs%3D',  
 'x-content-type-options': 'nosniff', 'transfer-encoding': 'chunked',
 'expires': 'Sat, 01 Jan 2000 00:00:00 GMT', 'connection': 'keep-alive',
 '-content-encoding': 'gzip', 'pragma': 'no-cache', 
 'cache-control': 'private, no-cache, no-store, must-revalidate', 
 'date': 'Thu, 19 Jul 2012 03:46:44 GMT', 'x-frame-options': 'DENY', 
 'content-type': 'text/html; charset=utf-8', 
 'x-fb-debug': 'cXSDiq5jL9ZffjalabM6QKEgr50QOhPJsNlHW2MpSSQ='} 

我有点困惑,因为我没有看到一个名为“访问令牌”的变量,我什至看到了像 auth_signature_methodoauth_signature 这样的奇怪术语,但我不知道它们是什么意思。

如何从 Facebook 检索访问令牌?此外,如何使用此访问令牌从用户那里检索“姓名”等基本信息?访问令牌只是一个字符串,对吧?

【问题讨论】:

    标签: python facebook oauth-2.0


    【解决方案1】:

    我不知道你的代码。但是如果你使用 Facebook graph api 那就很简单了。

    def authorize(self):
    
            warnings.filterwarnings('ignore', category=DeprecationWarning)
            savout = os.dup(1)
            os.close(1)
            os.open(os.devnull, os.O_RDWR)
            try:
                webbrowser.open(FBOAuth.FACEBOOK_GRAPH_URL+'/oauth/authorize?'+urllib.urlencode(
                                    {'client_id':FBOAuth.CLIENT_ID,
                                     'redirect_uri':FBOAuth.REDIRECT_URI,
                                     'scope':'read_stream, publish_stream'}))
            finally:
                os.dup2(savout, 1)
    
            FBOAuth.SECRET_CODE = raw_input("Secret Code: ")
            self.save_secret_code(FBOAuth.SECRET_CODE)
    
            return FBOAuth.SECRET_CODE
    
    def access_token(self):
    if not FBOAuth.SECRET_CODE:
        FBOAuth.SECRET_CODE = self.authorize()
    
    args = {'redirect_uri': FBOAuth.REDIRECT_URI,
            'client_id' : FBOAuth.CLIENT_ID,
            'client_secret':FBOAuth.CLIENT_SECRET,
            'code':FBOAuth.SECRET_CODE,}
    
    access_token = urllib.urlopen(FBOAuth.FACEBOOK_GRAPH_URL + "/oauth/access_token?" + urllib.urlencode(args)).read()
    access_token = urlparse.parse_qs(access_token)
    FBOAuth.ACCESS_TOKEN = access_token['access_token'][0]
    self.save_access_token(FBOAuth.ACCESS_TOKEN)
    return FBOAuth.ACCESS_TOKEN
    

    通过这两个函数,您可以获得访问令牌。 Here 是我使用的教程的链接。 Facebook graph api documents供参考。

    【讨论】:

      【解决方案2】:

      就像大多数身份验证过程一样,您传入您的应用 ID,然后取回一个“代码”。在第二个“GET”中,您将其发送到 access_token。您需要对结果进行解密,结果可能在 HMAC 中。使用SDK来管理这些功能,按照其他人的建议,会更容易。

      “auth_signature_method”表示加密签名的签名方式。它不是您可以用来在 Facebook 上查询用户数据的最终 access_token。

      【讨论】:

        【解决方案3】:

        您的代码有几个方面的错误,主要是忘记了您需要让用户参与交易。

        请参阅https://developers.facebook.com/docs/authentication/server-side/ 了解要遵循的步骤,这些实际上非常简单,您可以使用 curl 手动完成所有操作。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2021-06-23
          • 2011-11-13
          • 1970-01-01
          • 2023-03-04
          • 1970-01-01
          • 2013-08-10
          相关资源
          最近更新 更多