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