Проблема с аутентификацией facebook, когда пользователь переключает учетные записи - PullRequest
1 голос
/ 11 ноября 2010

У меня проблема с аутентификацией пользователей Facebook через oauth 2.0 в моем веб-приложении на Java. Проблема возникает, когда пользователь, использующий мое приложение, выходит из своей учетной записи Facebook и снова входит в другую учетную запись Facebook. Затем, когда я пытаюсь аутентифицировать новую учетную запись Facebook, Facebook отвечает 400 ошибкой. Если пользователь затем переключает обратно первую учетную запись, тогда Facebook будет аутентифицировать их просто отлично.

Мне кажется, проблема в том, что когда я запрашиваю код у facebook, он возвращает один и тот же код для обоих пользователей, но второй пользователь не может получить токен доступа с этим кодом, потому что код был создан для первого пользователя.

Кто-нибудь знает, как я могу это исправить? Вот урезанная версия моего кода. Обратите внимание, у меня есть перехватчик, который автоматически перенаправляет пользователей на FacebookDirectorAction, если на странице требуется, чтобы они вошли в систему. Таким образом, FacebookDirectorAction обрабатывает получение кода, токена доступа и, наконец, перенаправляет пользователя обратно на исходную страницу, которую он запросил.

@UrlBinding("/facebookdirector/{destination}/{destinationParameter}")
public class FacebookDirectorAction extends BaseActionBean {

    private static final String BASE_REDIRECT_URI = "http://apps.facebook.com/lawlessdev/facebookdirector";
    private static final String APP_ID = "My app id";
    private static final String APP_SECRET = "My secret";

    public static final String AUTH_VIEW = VIEW_PATH + "auth.jsp";

    private String destination;
    private String destinationParameter;
    private String code;
    private String access_token;
    private String authUrl;

    @DefaultHandler
    public Resolution direct() throws IOException, FacebookException, ServletException {
        if (access_token == null && code == null) {
            return authorize();
        }
        else if (access_token == null) {
            retrieveAccessToken();
        }
        // If access_token is still null then we may mave a bad code.  Redirect to an insecure page.
        if (access_token == null) {
            return new RedirectResolution(CategoriesAction.class);
        }

        RedirectResolution redirectResolution = new RedirectResolution("/" + destination + (destinationParameter != null ? "/" + destinationParameter : ""));
        redirectResolution.addParameter("access_token", access_token);
        return redirectResolution;
    }

    public Resolution authorize() throws IOException, ServletException {
        authUrl = "https://graph.facebook.com/oauth/authorize?client_id=" + APP_ID + "&redirect_uri=" + getRedirectUri();
        return new ForwardResolution(AUTH_VIEW);
    }

    public void retrieveAccessToken() throws UnsupportedEncodingException {
        try {
            URL accessTokenURL = new URL("https://graph.facebook.com/oauth/access_token?client_id=" + APP_ID + "&client_secret=" + APP_SECRET + "&code=" + code + "&redirect_uri=" + getRedirectUri());
            URLConnection accessTokenURLConnection = accessTokenURL.openConnection();
            accessTokenURLConnection.connect();
            BufferedReader in = new BufferedReader(
                                new InputStreamReader(
                                accessTokenURLConnection.getInputStream()));
            String inputLine;

            while ((inputLine = in.readLine()) != null) {
                ParameterParser parameterParser = new ParameterParser();
                List<NameValuePair> nameValuePairs = parameterParser.parse(inputLine, '&');
                for (NameValuePair nameValuePair : nameValuePairs) {
                    if (nameValuePair.getName().equals("access_token")) {
                        access_token = nameValuePair.getValue();
                    }
                }
            }
            in.close();

        } catch (MalformedURLException e) {     // new URL() failed
        } catch (IOException e) {               // openConnection() failed
        }
    }

    private String getRedirectUri() throws UnsupportedEncodingException {
        return BASE_REDIRECT_URI + "/" + destination + (destinationParameter != null ? "/" + destinationParameter : "");
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...