Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/facebook/8.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 使用OAUTH 2.0验证并从Facebook cookie获取数据_Java_Facebook_Cookies_Oauth - Fatal编程技术网

Java 使用OAUTH 2.0验证并从Facebook cookie获取数据

Java 使用OAUTH 2.0验证并从Facebook cookie获取数据,java,facebook,cookies,oauth,Java,Facebook,Cookies,Oauth,我有一个用GWT制作的网页。在那里,我使用了所有登录facebook的东西和一个被操纵的gwtfb库,一切正常。迁移到oauth 2.0后,现在发送到服务器的cookie已更改为加密cookie 我想得到一个java示例代码,它在服务器中实现了与旧代码相同的: 我需要像使用CookieMd5技巧之前一样验证调用,以了解调用是否由我的客户端页面进行 从cookie中获取数据:我需要facebook用户 如果可能,不调用FB,只使用cookie数据 提前感谢。我认为cookie数据是任意格式的—

我有一个用GWT制作的网页。在那里,我使用了所有登录facebook的东西和一个被操纵的gwtfb库,一切正常。迁移到oauth 2.0后,现在发送到服务器的cookie已更改为加密cookie

我想得到一个java示例代码,它在服务器中实现了与旧代码相同的

  • 我需要像使用CookieMd5技巧之前一样验证调用,以了解调用是否由我的客户端页面进行
  • 从cookie中获取数据:我需要facebook用户
如果可能,不调用FB,只使用cookie数据


提前感谢。

我认为cookie数据是任意格式的——因为你不应该自己解释它?SDK肯定应该为您验证cookie吗?

我刚刚将此添加到BatchFB的新版本(2.1.1)中:

要获取用户id,请执行以下操作:

FacebookCookie data = FacebookCookie.decode(cookie, YOURAPPSECRET);
System.out.println("Facebook user id is " + data.getFbId());
您可以在这里看到使用Jackson解析JSON和javax.crypto.Mac验证签名的代码:

不幸的是,获取访问令牌要复杂得多。fbsr_uuCookie中的数据包含一个“代码”,您可以使用该代码进行图形api获取,以获取真正的访问令牌。。。您必须将其存储在cookie或会话中的某个位置。这真是太差劲了


更好的解决方案是从javascript设置自己的访问令牌cookie。每次调用FB.getLoginStatus()时,都要让它设置(或删除)您自己的cookie。你不必担心签署访问令牌,因为它是不可用的。

好吧,尽管我有一些好的答案,但我还是用我在博客中写的回答自己:

现在cookie已经改变了很多:它是加密的,没有accesstoken,并且它的内容格式已经改变了很多。这里有几个关于它的链接:

因此,要验证cookie,请从中获取用户并获取访问令牌,您可以使用以下代码:

public class FaceBookSecurity {

// return the fb user in the cookie.
public static String getFBUserFromCookie(HttpServletRequest request)
        throws Exception {
    Cookie fbCookie = getFBCookie(request);

    if (fbCookie == null)
        return null;

    // gets cookie value
    String fbCookieValue = fbCookie.getValue();

    // splits it.
    String[] stringArgs = fbCookieValue.split("\\.");
    String encodedPayload = stringArgs[1];

    String payload = base64UrlDecode(encodedPayload);

    // gets the js object from the cookie
    JsonObject data = new JsonObject(payload);

    return data.getString("user_id");

}

public static boolean ValidateFBCookie(HttpServletRequest request)
        throws Exception {

    Cookie fbCookie = getFBCookie(request);

    if (fbCookie == null)
        throw new NotLoggedInFacebookException();

    // gets cookie information
    String fbCookieValue = fbCookie.getValue();

    String[] stringArgs = fbCookieValue.split("\\.");
    String encodedSignature = stringArgs[0];
    String encodedPayload = stringArgs[1];

    //decode
    String sig = base64UrlDecode(encodedSignature);
    String payload = base64UrlDecode(encodedPayload);

    // gets the js object from the cookie
    JsonObject data = new JsonObject(payload);

    if (!data.getString("algorithm").Equals("HMAC-SHA256")) {
        return false;
    }

    SecretKey key = new SecretKeySpec(
            ApplicationServerConstants.FacebookSecretKey.getBytes(),
            "hmacSHA256");

    Mac hmacSha256 = Mac.getInstance("hmacSHA256");
    hmacSha256.init(key);
    // decode the info.
    byte[] mac = hmacSha256.doFinal(encodedPayload.getBytes());

    String expectedSig = new String(mac);

    // compare if the spected sig is the same than in the cookie.
    return expectedSig.equals(sig);

}

public static String getFBAccessToken(HttpServletRequest request)
        throws Exception {
    Cookie fbCookie = getFBCookie(request);

    String fbCookieValue = fbCookie.getValue();

    String[] stringArgs = fbCookieValue.split("\\.");
    String encodedPayload = stringArgs[1];

    String payload = base64UrlDecode(encodedPayload);

    // gets the js object from the cookie
    JsonObject data = new JsonObject(payload);

    String authUrl = getAuthURL(data.getString("code"));
    URL url = new URL(authUrl);
    URI uri = new URI(url.getProtocol(), url.getHost(), url.getPath(),
            url.getQuery(), null);
    String result = readURL(uri.toURL());

    String[] resultSplited = result.split("&");

    return resultSplited[0].split("=")[1];

}

// creates the url for calling to oauth.
public static String getAuthURL(String authCode) {
    String url = "https://graph.facebook.com/oauth/access_token?client_id="
            + ApplicationConstants.FacebookApiKey
            + "&redirect_uri=&client_secret="
            + ApplicationServerConstants.FacebookSecretKey + "&code="
            + authCode;

    return url;
}

// reads the url.
private static String readURL(URL url) throws IOException {

    InputStream is = url.openStream();

    InputStreamReader inStreamReader = new InputStreamReader(is);
    BufferedReader reader = new BufferedReader(inStreamReader);

    String s = "";

    int r;
    while ((r = is.read()) != -1) {
        s = reader.readLine();
    }

    reader.close();
    return s;
}

private static String base64UrlDecode(String input) {
    String result = null;
    Base64 decoder = new Base64(true);
    byte[] decodedBytes = decoder.decode(input);
    result = new String(decodedBytes);
    return result;
}

    private static Cookie getFBCookie(HttpServletRequest request) 
    {
        Cookie[] cookies = request.getCookies();

        if (cookies == null)
            return null;

        Cookie fbCookie = null;

        for (Cookie c : cookies) {
            if (c.getName().equals(
                "fbsr_" + ApplicationServerConstants.FacebookApiKey)) {
                fbCookie = c;
            }
        }
        return fbCookie;
    }
}

但我需要在服务器上完成。java没有sdk:(.if(data.getString(“算法”)!=“HMAC-SHA256”){正确的是:if(!“HMAC-SHA256”).equals(data.getString(“算法”)){