1

我们正在使用 restFB 1.6.12。我通过两种方式获取 facebook 访问令牌,

1. CLIENT_APP_ID = "XXXXXXXXXXXXXXXXXX"; 
   CLIENT_SECRET = "XXXXXXXXXXXXXXXXXX"; 
   REDIRECT_URL  = "XXXXXXXXXXXXXXXXXX";
   AUTH_CODE = "XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX"; 
   SCOPE = "email,read_stream";

    Redirect to facebook as the example. As a result I'll get an
    authorization code  
    https://www.facebook.com/dialog/oauth?client_id=YOUR_APP_ID&redirect_uri=YOUR_URL&scope=email,read_stream

    asking for an access_token using,

    https://graph.facebook.com/oauth/access_token?client_id=YOUR_APP_ID&redirect_uri=YOUR_URL&client_secret=YOUR_APP_SECRET&code=THE_CODE_FROM_ABOVE

    this returns the access token like this,

    access_token=CAAHWfjdHDKcBAIL0zHMeJKzJw8Ug7WrrrkNxpBnK7ubnFR1RGtIIZA7T3UPlhCSV0hPJXZAgTcKfBSfHZAyxsndc3RT72XMREjACxnGb0ZCGMZAUgDWH3FgOhnaoSBMgkaQBPDOCCEKcLnznMYSncWS7dVxl9IFrSzeFjF6LKOWB3NTynl5X1&expires=5125218

 2. AccessToken accessToken = new
    DefaultFacebookClient().obtainAppAccessToken(appid,appsecret);
    String token=accessToken.getAccessToken();

    It reurns the access token like this,

    access_token=517312558337191|5oHY9T3cZICO_TCeK8OdXKg5Y08

如果我使用第一个(1)一个,它在第一次访问之后可以正常工作,然后每次访问都会引发错误

Auth Token= {"error":{"message":"This authorization code has been used.","type":"OAuthException","code":100}}

如果我使用第二个(2),它只适用于 publicSearchMessages 但是当我访问 publicEvents 或其他搜索时它会引发错误

com.restfb.exception.FacebookOAuthException: Received Facebook error response of type OAuthException: (#200) Must have a valid access_token to access this endpoint
    at com.restfb.DefaultFacebookClient$DefaultGraphFacebookExceptionMapper.exceptionForTypeAndMessage(DefaultFacebookClient.java:766)
    at com.restfb.DefaultFacebookClient.throwFacebookResponseStatusExceptionIfNecessary(DefaultFacebookClient.java:688)
    at com.restfb.DefaultFacebookClient.makeRequestAndProcessResponse(DefaultFacebookClient.java:630)
    at com.restfb.DefaultFacebookClient.makeRequest(DefaultFacebookClient.java:592)
    at com.restfb.DefaultFacebookClient.makeRequest(DefaultFacebookClient.java:556)
    at com.restfb.DefaultFacebookClient.fetchConnection(DefaultFacebookClient.java:219)

我的问题是,这两个访问令牌有什么区别,我如何以编程方式为第一个访问代码生成访问代码以工作 publicSearchMessages、getPublicEvents 和其他搜索?

哪一个访问令牌用于按预期工作?

4

1 回答 1

1

Access_tokens 允许用户以安全和社交的方式与您的应用程序进行交互。虽然我们正在删除对offline_access 权限的使用,但通过App Dashboard 中的迁移设置,我们现在允许选择使用具有长期过期时间的access_tokens,每次用户重新访问您的应用程序时都可以续订

当用户使用现有的、有效的、短期用户 access_token 访问您的站点时,您可以选择延长该访问令牌的到期时间。每天延长一次过期时间,因此即使用户每天多次重新访问您的网站,令牌也会在第一次请求时延长。您必须确保在短暂的 access_token 过期之前调用下面的新端点。使用下面的新端点,您将能够延长现有的、未过期的、短期用户 access_token 的过期时间。

要获得长期用户 access_token,只需将您自己的 client_id(您的 app_id)、您的 app_secret 和未过期的短期 access_token 传递给端点。你会得到一个新的长寿命用户access_token;除了传递到端点的短期 access_token 之外,此 access_token 还将存在

简而言之,获取页面访问令牌——默认情况下不会过期;并确保使用长期用户访问令牌这样做

您可以在此处访问 facebook 文档以获取更多信息

要获得扩展的页面访问令牌,请将用户访问令牌换成长期使用的令牌,然后请求页面令牌。这个页面的“扩展”令牌实际上没有任何到期时间。

https://developers.facebook.com/docs/howtos/login/extending-tokens/#step1

通过执行 curl 请求并在代码中手动保存“页面访问令牌”来解决此问题

于 2013-09-06T07:21:15.447 回答