另一台服务器上的 Spring Social Facebook URL 重定向

Posted

技术标签:

【中文标题】另一台服务器上的 Spring Social Facebook URL 重定向【英文标题】:Spring Social Facebook URL Redirect on another server 【发布时间】:2016-11-14 20:06:12 【问题描述】:

我是 Spring Social API 的新手,我正在尝试通过 facebook 登录我的应用程序,但它没有将我重定向到我的域 url。

我的应用程序在两台服务器上运行,它基于提交了 ajax 表单的 restcontroller。一个是apache web server,另一个是tomcat server。

但我的 facebook 身份验证不是基于 restcontroller,如果用户需要通过 facebook ID 登录,那么他只需点击登录 facebook 按钮和页面成功重定向到 facebook 登录页面,但不会重定向回请求的 URL .

我的代码如下:

使用 Facebook 登录

@RequestMapping(value = "/fbauth", method = RequestMethod.GET) public void fbredirect(@RequestParam Map requestParams) 抛出 UnsupportedEncodingException 字符串访问令牌 = null; // 字符串访问令牌 = // “CAAFv5tfCxvsBAMkGz7Mz63ESCLEK3jgZBEZAZBqlj3CApIyqmvA5hOrtl9Ln05O3BRTcx95TjT9IxZBfRz3fKZBjNJ74qko1SFjjzAXmdDnzVePmGXswOM8NHEGTZA6aub7bnZBYBIMO2ZBXX2gpo6ky7Dkqu2xZBUymAalAgg3ixaRQMe3e3w1ruUtVeyQrtMb3x0pehHOIaTQZDZD”; RestTemplate restTemplate = new RestTemplate(); 映射结果 = null; if (StringUtils.isEmpty(accessToken)) 对于(字符串键:requestParams.keySet()) 对象值 = requestParams.get(key); logger.info("键:" + 键 + " 值:" + 值);

        String code = requestParams.get("code");
        if (StringUtils.isNotEmpty(code)) 
            String authUrl = "http://" + request.getServerName() + "/realtybud/fbauth";
            StringBuilder stringBuilder = new StringBuilder();
            String fbAuthApi = "https://graph.facebook.com/v2.3/oauth/access_token?client_id=";
            stringBuilder.append(fbAuthApi);
            stringBuilder.append(selectAppId());
            stringBuilder.append("&redirect_uri=");
            stringBuilder.append(authUrl);
            stringBuilder.append("&client_secret=");
            stringBuilder.append(selectAppSecret());
            stringBuilder.append("&code=");
            stringBuilder.append(code);
            String fbGraphUrl = stringBuilder.toString();

            result = restTemplate.getForObject(fbGraphUrl, Map.class);
            accessToken = result.get("access_token");
            logger.info("Access Token: " + accessToken);
        
    

    StringBuilder stringBuilder = new StringBuilder();
    String fbGraphApi = "https://graph.facebook.com/v2.3/me?fields=id,name,email&access_token=";
    stringBuilder.append(fbGraphApi);
    stringBuilder.append(accessToken);
    String fbProfileInfo = stringBuilder.toString();
    // String info = restTemplate.getForObject(fbProfileInfo, String.class);
    // logger.info("Info: " + info);
    Map<String, String> info = restTemplate.getForObject(fbProfileInfo, Map.class);
    logger.info("Id: " + info.get("id") + " name: " + info.get("name") + " email: " + info.get("email"));
    String email = info.get("email");
    if (StringUtils.isNotEmpty(email)) 
        User user = userService.findUserByEmail(email);
        if (user == null) 
            user = new User();
            user.setEmail(email);
            user.setFacebookAccessToken(accessToken);
            user.setFacebookName(info.get("name"));
            userService.userSave(user);

            Role userRole = new Role();
            userRole.setRoleName("ROLE_USER");
            userRole.setUser(user);
            userService.roleSave(userRole);

            List<Role> roles = new ArrayList<Role>();
            roles.add(userRole);
            user.setRoles(roles);
         else 
            user.setFacebookAccessToken(accessToken);
            user.setFacebookName(info.get("name"));
            userService.userSave(user);
        

        SecurityUser secUser = new SecurityUser(user);
        Authentication authentication = new UsernamePasswordAuthenticationToken(secUser, secUser.getPassword(),
                secUser.getAuthorities());
        SecurityContextHolder.getContext().setAuthentication(authentication);

     else 
        // error
    

    // String fbAuthSuccessUrl = "/index?fbAuth=success";
    //return "redirect:/";

请帮助我如何使用登录凭据重定向到 apache 网络服务器。

提前致谢。 瓦卡斯

【问题讨论】:

我在问题中没有提到的另一件事是。当表单提交请求从 apache web 服务器转发到 tomcat 服务器时,我只需要返回到我的 apache web 服务器域 url。我已经在 developer.facebook 应用程序中使用站点 url 设置了域 url。 【参考方案1】:

我通过在我的网络服务器(在我的例子中是 nginx)中更改重定向 URL 解决了我的问题,我不知道这是不是最好的方法(甚至是合适的)!

【讨论】:

您更改了哪个重定向 URL?我也尝试过 request.getServerName() 重定向,但没有成功。有没有办法在spring控制器中找出我们收到请求的url并重定向回那个url? 在我的例子中,ngnix 将重定向 url 更改为 localhost(因为它是 tomcat 和社交服务器之间的代理)。所以我强迫 nginx 在所有传出请求中设置重定向 url 到我自己的服务器 url。 @WaqasBaig

以上是关于另一台服务器上的 Spring Social Facebook URL 重定向的主要内容,如果未能解决你的问题,请参考以下文章

另一台服务器上的Gitlab-runner

MySql 5.0 可以查看位于另一台服务器上的表吗

从网络上的另一台电脑访问 ASP.NET 开发服务器

通过位于另一台服务器上的另一个应用程序保护 asp.net 网站

有没有办法告诉 mongod 登录到另一台服务器上的系统日志?

Oracle 调用另一台机器上的 Java 方法