У меня проблема с аутентификацией пользователей 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 : "");
}
}