我正在尝试为 Facebook 开发一个应用程序。我写了一个 facebook 控制器并创建了 connectionFactory 对象,得到了 oAuth 操作和 accessgrant 对象。我也得到了访问令牌但是一旦我尝试创建连接
Connection<Facebook> connection = connectionFactory.createConnection(accessGrant);
我收到错误消息:
MissingAuthorizationException:操作需要授权,但是API绑定是未经授权创建的。
完整的堆栈跟踪:
[1/25/12 9:18:17:097 IST] 0000001a SystemOut O oauthOperations:org.springframework.social.facebook.connect.FacebookOAuth2Template@46714671 [1/25/12 9:18:17:097 IST] 0000001a SystemOut O authorizeUrl:https://graph.facebook.com/oauth/authorize?client_id=xxxxx&response_type=code&redirect_uri=http%3A%2F%2Flocalhost%3A80% 2FSpringSocial%2Fstart&scope=read_stream%2Cemail%2Cpublish_stream%2Coffline_access [1/25/12 9:19:15:930 IST] 0000001a SystemOut O oauthOperations 授权代码:org.springframework.social.facebook.connect.FacebookOAuth2Template@46714671 [1/25/12 9:19:25:197 IST] 0000001a SystemOut O accssTokentemp :xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx [1/25/12 9:19:35:541 IST] 0000001a SystemOut O facebook:org.springframework.social.facebook.api.impl.FacebookTemplate@21c221c2 [1/25/12 9:19:35:994 IST] 0000001a RestTemplate W org.springframework.web.client.RestTemplate handleResponseError GET 请求“https://graph.facebook.com/me”导致 400(错误请求); 调用错误处理程序 [1/25/12 9:19:36:041 IST] 0000001a servlet E com.ibm.ws.webcontainer.servlet.ServletWrapper 服务 SRVE0068E:在应用程序 SpringSocialFacebookEar 中的 servlet SpringSocial 的服务方法之一中创建了未捕获的异常。创建异常:org.springframework.web.util.NestedServletException:请求处理失败;嵌套异常是 org.springframework.social.MissingAuthorizationException: 操作需要授权,但是 API 绑定是未经授权创建的。 在 org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:681) 在 org.springframework.web.servlet.FrameworkServlet.doGet(FrameworkServlet.java:574) 在 javax.servlet.http.HttpServlet.service(HttpServlet.java:718) 在 javax.servlet.http.HttpServlet.service(HttpServlet.java:831) 在 com.ibm.ws.cache.servlet.ServletWrapper.serviceProxied(ServletWrapper.java:307) 在 com.ibm.ws.cache.servlet.CacheHook.handleFragment(CacheHook.java:579) 在 com.ibm.ws.cache.servlet.CacheHook.handleServlet(CacheHook.java:250) 在 com.ibm.ws.cache.servlet.ServletWrapper.service(ServletWrapper.java:259) 在 com.ibm.ws.webcontainer.servlet.ServletWrapper.service(ServletWrapper.java:1663) 在 com.ibm.ws.webcontainer.servlet.ServletWrapper.handleRequest(ServletWrapper.java:939) 原因:org.springframework.social.MissingAuthorizationException:操作需要授权,但是API绑定是未经授权创建的。 在 org.springframework.social.facebook.api.impl.FacebookErrorHandler.handleFacebookError(FacebookErrorHandler.java:95) 在 org.springframework.social.facebook.api.impl.FacebookErrorHandler.handleError(FacebookErrorHandler.java:60) 在 org.springframework.web.client.RestTemplate.handleResponseError(RestTemplate.java:486) 在 org.springframework.web.client.RestTemplate.doExecute(RestTemplate.java:443) 在 org.springframework.web.client.RestTemplate.execute(RestTemplate.java:415) 在 org.springframework.web.client.RestTemplate.getForObject(RestTemplate.java:213) 在 org.springframework.social.facebook.api.impl.FacebookTemplate.fetchObject(FacebookTemplate.java:165) 在 org.springframework.social.facebook.api.impl.UserTemplate.getUserProfile(UserTemplate.java:50) 在 org.springframework.social.facebook.api.impl.UserTemplate.getUserProfile(UserTemplate.java:46) 在 org.springframework.social.facebook.connect.FacebookAdapter.setConnectionValues(FacebookAdapter.java:42) 在 org.springframework.social.facebook.connect.FacebookAdapter.setConnectionValues(FacebookAdapter.java:30) 在 org.springframework.social.connect.support.AbstractConnection.setValues(AbstractConnection.java:172) 在 org.springframework.social.connect.support.AbstractConnection.initKey(AbstractConnection.java:135) 在 org.springframework.social.connect.support.OAuth2Connection.(OAuth2Connection.java:73) 在 org.springframework.social.connect.support.OAuth2ConnectionFactory.createConnection(OAuth2ConnectionFactory.java:58) 在 com.tgt.social.controller.FaceBookConnectController.facebookConnect(FaceBookConnectController.java:107)
我的控制器类:
@Controller
public class FaceBookConnectController {
private static OAuth2Operations oauthOperations = null;
private static FacebookConnectionFactory connectionFactory = null;
private static OAuth2Parameters params = null;
@RequestMapping("/start")
public ModelAndView facebookConnect(Model model,HttpServletRequest request,HttpServletResponse response) {
Security.setProperty("ssl.SocketFactory.provider", "com.ibm.jsse2.SSLSocketFactoryImpl");
Security.setProperty("ssl.ServerSocketFactory.provider", "com.ibm.jsse2.SSLServerSocketFactoryImpl");
System.setProperty("https.proxyHost", "localhost");
System.setProperty("https.proxyPort", "8888");
String clientId = "xxxxxxxxx";
String clientSecret = "xxxxxxxxxxxxxxxxxxxxxxxxxx";
String redirectUrl = "http://localhost:80/SpringSocial/start";
try {
String authorizationCode = request.getParameter("code");
if(null != authorizationCode){
MultiValueMap paramsMap1 = new LinkedMultiValueMap();
System.out.println("oauthOperations authorizationCode :"+oauthOperations);
//paramsMap.set("client_id", clientId);
//paramsMap.set("client_secret", clientSecret);
//paramsMap.set("code", authorizationCode);
paramsMap1.set("redirect_uri", redirectUrl);
paramsMap1.set("grant_type", "authorization_code");
paramsMap1.set("scope","read_stream,user_about_me,user_birthday,user_likes,user_status,email,publish_stream,offline_access");
//AccessGrant accessGrant = oauthOperations.exchangeForAccess(authorizationCode, redirectUrl, paramsMap1);
System.out.println("connectionFactory authorizationCode :"+connectionFactory);
AccessGrant accessGrant = connectionFactory.getOAuthOperations().exchangeForAccess(authorizationCode, redirectUrl, paramsMap1);
String accssTokentemp = accessGrant.getAccessToken();
System.out.println("accssTokentemp :"+accssTokentemp);
String scope_p = accessGrant.getScope();
System.out.println("scope_p :"+scope_p);
Facebook facebook = new FacebookTemplate(accssTokentemp);
System.out.println("facebook :"+facebook);
Connection<Facebook> connection = connectionFactory.createConnection(accessGrant);
//FacebookProfile userProfile = facebook.userOperations().getUserProfile();
System.out.println("connection :"+connection);
}else{
MultiValueMap paramsMap = new LinkedMultiValueMap();
connectionFactory = new FacebookConnectionFactory(clientId,clientSecret);
System.out.println("connectionFactory :"+connectionFactory);
oauthOperations = connectionFactory.getOAuthOperations();
params = new OAuth2Parameters();
params.setRedirectUri(redirectUrl);
params.setScope("read_stream,user_about_me,user_birthday,user_likes,user_status,email,publish_stream,offline_access");
paramsMap.set("client_id", clientId);
paramsMap.set("client_secret", clientSecret);
paramsMap.set("code", authorizationCode);
paramsMap.set("redirect_uri", redirectUrl);
paramsMap.set("grant_type", "authorization_code");
System.out.println("oauthOperations :"+oauthOperations);
String authorizeUrl = oauthOperations.buildAuthorizeUrl(GrantType.AUTHORIZATION_CODE, params);
System.out.println("authorizeUrl :"+authorizeUrl);
response.sendRedirect(authorizeUrl);
}
} catch (IOException e) {
e.printStackTrace();
}
return null;
}
}
请让我知道这里有什么问题?connectionFactory 对象的实例化是否不正确。