2014-12-05 34 views
0

你好,请帮我新的春天的社会,我同时获得来自AUTHORIZATION_CODE访问令牌获取400错误..春实社会用的accessToken 400错误

我的代码如下

@RequestMapping(value = "/facebook", method = RequestMethod.POST, produces = "application/json") 
    @ResponseBody 
    public Object getFacebookLoginPage(@RequestBody SocialCommand socialCommand) throws Exception { 
     loggerService.debug("In ShareController", "getFacebookLoginPage method for facebook", "returns the JSON response for the input socialCommand"); 
     Result result = new Result(); 
     result.status = "OK"; 
     dataObject = socialCommand; 
     FacebookConnectionFactory connectionFactory = new FacebookConnectionFactory(msgprop.getProperty("facebook.appId"), msgprop.getProperty("facebook.appSecrete"), msgprop.getProperty("facebook.namespace")); 
     oAuth2Operations = connectionFactory.getOAuthOperations(); 
     OAuth2Parameters params = new OAuth2Parameters(); 
     params.setScope(msgprop.getProperty("facebook.scope")); 
     params.setRedirectUri(msgprop.getProperty("facebook.redirectURI")); 
//  params.set("Content-Type", MediaType.MULTIPART_FORM_DATA.getType()); 
     String authorizeUrl = oAuth2Operations.buildAuthorizeUrl(GrantType.AUTHORIZATION_CODE, params); 
     System.out.println(authorizeUrl); 
     SuccessResponse successResponse = new SuccessResponse(); 
     successResponse.resultObj = authorizeUrl; 
     result.response = successResponse; 
     return result; 

    } 

和回调控制器是如下

@RequestMapping(value = "/facebook/callback", params = "code", method = RequestMethod.GET) 
    public Object faceBookCallback(@RequestParam(value = "code") String callBackCode, Model model) throws IOException { 
     loggerService.debug("In ShareController", "faceBookCallback method for facebook", "returns the JSON response for the input socialCommand"); 
     MultiValueMap<String, String> formData = new LinkedMultiValueMap<String, String>(); 
     formData.add("client_id", msgprop.getProperty("facebook.appId")); 
     formData.add("client_secret", msgprop.getProperty("facebook.appSecrete")); 
     formData.add("scope", msgprop.getProperty("facebook.scope")); 
     formData.add("redirect_uri", msgprop.getProperty("facebook.redirectURI")); 
     formData.set("grant_type", "authorization_code"); 
     formData.set("Content-Type", MediaType.MULTIPART_FORM_DATA.getType()); 
     AccessGrant accessGrant = oAuth2Operations.exchangeForAccess(callBackCode, msgprop.getProperty("facebook.redirectURI"), formData); 
     System.out.println(accessGrant.getAccessToken()); 
     appStatus.getActivityId(); 
     SocialCommand socialCommand = (SocialCommand) dataObject; 
     socialCommand.setAppType("facebook"); 
     socialCommand.setAccessToken(accessGrant.getAccessToken()); 
     getImageLocation(socialCommand); 

     model.addAttribute("activityId", appStatus.getActivityId()); 

     return "backToViewDetails"; 
    } 

oAuth2Operations.exchangeForAccess给予400坏请求

回答

0

我注意到了几件事...

首先,为什么要编写自己的控制器来执行OAuth舞蹈,而不是使用Spring Social提供的ConnectController? ConnectController可以处理所有重定向,并且从一开始就是Spring Social的一部分。 Spring Social Showcase(https://github.com/spring-projects/spring-social-samples/tree/master/spring-social-showcase)是使用ConnectController的项目的示例。即使如此,假设您有充分的理由编写自己的连接控制器,但在执行Facebook实际重定向的getFacebookLoginPage()中没有看到任何内容,所以我只能假设在未显示的代码中发生这种情况。然后,当重定向从Facebook返回时,我对为什么在调用exchangeForAccess()之前设置内容类型和大部分参数感到困惑。 (即使这样,你正在设置看起来像请求标题的东西,但是你将它设置为表单参数...没有必要,但也不是你想要的。)

再次,我鼓励你看看ConnectController(https://github.com/spring-projects/spring-social/blob/master/spring-social-web/src/main/java/org/springframework/social/connect/web/ConnectController.java)。它可能会做你需要它做的事情。即使您仍然觉得需要编写自己的控制器,您可以看看ConnectController如何作为如何编写自己的控制器的指南。

+0

连接控制器是否可以用于所有的社交网站如脸谱,微博,tumblr和linkedIn等..? – 2014-12-09 05:08:38

+0

在这里,我的社交控制器应该能够发布/阅读操作与从iphone,android和Windows应用程序生成的访问令牌,该应用程序使我的控制器处于休息状态。请你能帮助我更好地配置我的社交控制器的方式。 – 2015-06-29 06:49:46