RestFB:使用Facebook应用程序获取用户访问令牌

11

这是我拥有的东西:

static AccessToken accessToken = new DefaultFacebookClient().obtainExtendedAccessToken("<my app id>", "<my app secret>");
static FacebookClient client = new DefaultFacebookClient();
public static void main(String args[]) {
    System.out.print("Enter Your Status: ");
    BufferedReader br = new BufferedReader(new InputStreamReader(System.in));

    String status= null;

      try {
         userName = br.readLine();
         System.out.println("..........");
      } catch (IOException ioe) {
         System.out.println("!");
         System.exit(1);
      }

    FacebookType publishMessageResponse =
                client.publish("me/feed", FacebookType.class,
                Parameter.with("message", status));

那么第一行获取令牌并将其存储为AccessToken类型,但这对我有什么好处呢?因为接下来的一行中,我需要将访问令牌提供为字符串,而我无法进行转换。有任何帮助吗?

5个回答

11

首先,不要将应用程序令牌与用户令牌混淆(更多信息)。

要获取用户令牌,您需要:

  1. 提供一种让用户针对 Facebook 进行身份验证的方式(更多信息),并接收“code” - 一个加密字符串,每个登录请求都是唯一的。
  2. 使用此代码获取用户令牌。

您可以使用纯 RestFB 以下方式获取用户令牌:

private FacebookClient.AccessToken getFacebookUserToken(String code, String redirectUrl) throws IOException {
    String appId = "YOUR_APP_ID";
    String secretKey = "YOUR_SECRET_KEY";

    WebRequestor wr = new DefaultWebRequestor();
    WebRequestor.Response accessTokenResponse = wr.executeGet(
            "https://graph.facebook.com/oauth/access_token?client_id=" + appId + "&redirect_uri=" + redirectUrl
            + "&client_secret=" + secretKey + "&code=" + code);

    return DefaultFacebookClient.AccessToken.fromQueryString(accessTokenResponse.getBody());
}

这个要求很简单:

FacebookClient.AccessToken token = getFacebookUserToken(code, redirectUrl);
String accessToken = token.getAccessToken();
Date expires = token.getExpires();

请问您能否提供获取该代码的方法?例如一个小例子之类的。 - Vijay
@Vijay,我的回答的第1段中有更多详细信息的链接。例如:https://www.facebook.com/dialog/oauth?client_id=123&scope=email,user_birthday&display=popup&redirect_uri=myuri - Val
没错!要获取代码,可以使用Scribe-Java:https://github.com/fernandezpablo85/scribe-java/blob/master/src/test/java/org/scribe/examples/FacebookExample.java - searching9x
请更好地描述如何获取“code”参数 - Facebook文档仅提供通过打开对话框来获取的方法。如果凭据由后端属性文件或其他方式提供,则希望在应用程序中执行此操作。 - xetra11

9

除了Jack所说的AccessToken.getAccessToken()返回accessToken的字符串值之外,您可以通过像这样扩展DefaultFacebookClient来避免两次实例化DefaultFacebookClient:

import com.restfb.DefaultFacebookClient;

public class LoggedInFacebookClient extends DefaultFacebookClient {

    public LoggedInFacebookClient(String appId, String appSecret) {
        AccessToken accessToken = this.obtainAppAccessToken(appId, appSecret);
        this.accessToken = accessToken.getAccessToken();
    }

}

@akashyadav,你解决了吗?我已经使用这段代码多年了,从未出现过问题。 - Kenny Cason
不好意思,我仍然无法使用它生成访问令牌...它生成了一些字符串,但那不能用作访问令牌。 - akash yadav
我遇到了相同的问题,这段代码生成了一些字符串但没有访问令牌。 - swaheed

5
尝试以下代码:
AccessToken accessToken = new DefaultFacebookClient().obtainAppAccessToken(appid,appsecret);
String token=accessToken.getAccessToken();

我尝试了这段代码,但是出现了以下异常:Exception in thread "main" com.restfb.exception.FacebookOAuthException: Received Facebook error response of type OAuthException: Error validating client secret. (code 1, subcode null)。 - lulu

1

0

这将起作用

AccessToken accessToken = new DefaultFacebookClient().obtainAppAccessToken("XXXX", "XXXX");
String token=accessToken.getAccessToken();
DefaultFacebookClient facebookClient = new DefaultFacebookClient(token);

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接