Вот как я это делаю в App Engine:
Шаг 1) Зарегистрируйте «приложение» на Facebook (ср. https://developers.facebook.com/). Вы даете Facebook имя для приложения и URL-адрес. URL-адрес, который вы регистрируете, является URL-адресом страницы (jsp или servlet), которую вы хотите обработать при входе в систему. При регистрации вы получаете две строки: «идентификатор приложения» и «секрет приложения» (последний - ваш пароль, не выдавайте его и не пишите в html).
Для этого примера, скажем, URL-адрес, который я зарегистрировал: "http://myappengineappid.appspot.com/signin_fb.do".
2) С веб-страницы, скажем, с помощью кнопки, вы перенаправляете пользователя на следующий URL в Facebook, подставляя идентификатор вашего приложения для «myfacebookappid» в приведенном ниже примере. Вы также должны выбрать, какие разрешения (или «области действия») вы хотите задать пользователю (см. https://developers.facebook.com/docs/reference/api/permissions/). В примере я прошу доступ только к электронной почте пользователя.
(Полезно знать, что вы также можете передать необязательную строку, которая будет возвращена без изменений в параметре «state». Например, я передаю ключ хранилища данных пользователя, чтобы я мог получить пользователя при прохождении Facebook ключ обратно ко мне. Я не делаю этого в примере.)
Вот фрагмент jsp:
<%@page import="java.net.URLEncoder" %>
<%
String fbURL = "http://www.facebook.com/dialog/oauth?client_id=myfacebookappid&redirect_uri=" + URLEncoder.encode("http://myappengineappid.appspot.com/signin_fb.do") + "&scope=email";
%>
<a href="<%= fbURL %>"><img src="/img/facebook.png" border="0" /></a>
3) Ваш пользователь будет перенаправлен на Facebook, и его попросят утвердить запрашиваемые вами разрешения. Затем пользователь будет перенаправлен обратно на URL-адрес, который вы зарегистрировали. В этом примере это "http://myappengineappid.appspot.com/signin_fb.do", который в моем web.xml соответствует следующему сервлету:
import org.json.JSONObject;
import org.json.JSONException;
import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.io.IOException;
import java.net.URL;
import java.net.URLConnection;
import java.net.URLEncoder;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
public class SignInFB extends HttpServlet {
public void service(HttpServletRequest req, HttpServletResponse res) throws ServletException, IOException {
String code = req.getParameter("code");
if (code == null || code.equals("")) {
// an error occurred, handle this
}
String token = null;
try {
String g = "https://graph.facebook.com/oauth/access_token?client_id=myfacebookappid&redirect_uri=" + URLEncoder.encode("http://myappengineappid.appspot.com/signin_fb.do", "UTF-8") + "&client_secret=myfacebookappsecret&code=" + code;
URL u = new URL(g);
URLConnection c = u.openConnection();
BufferedReader in = new BufferedReader(new InputStreamReader(c.getInputStream()));
String inputLine;
StringBuffer b = new StringBuffer();
while ((inputLine = in.readLine()) != null)
b.append(inputLine + "\n");
in.close();
token = b.toString();
if (token.startsWith("{"))
throw new Exception("error on requesting token: " + token + " with code: " + code);
} catch (Exception e) {
// an error occurred, handle this
}
String graph = null;
try {
String g = "https://graph.facebook.com/me?" + token;
URL u = new URL(g);
URLConnection c = u.openConnection();
BufferedReader in = new BufferedReader(new InputStreamReader(c.getInputStream()));
String inputLine;
StringBuffer b = new StringBuffer();
while ((inputLine = in.readLine()) != null)
b.append(inputLine + "\n");
in.close();
graph = b.toString();
} catch (Exception e) {
// an error occurred, handle this
}
String facebookId;
String firstName;
String middleNames;
String lastName;
String email;
Gender gender;
try {
JSONObject json = new JSONObject(graph);
facebookId = json.getString("id");
firstName = json.getString("first_name");
if (json.has("middle_name"))
middleNames = json.getString("middle_name");
else
middleNames = null;
if (middleNames != null && middleNames.equals(""))
middleNames = null;
lastName = json.getString("last_name");
email = json.getString("email");
if (json.has("gender")) {
String g = json.getString("gender");
if (g.equalsIgnoreCase("female"))
gender = Gender.FEMALE;
else if (g.equalsIgnoreCase("male"))
gender = Gender.MALE;
else
gender = Gender.UNKNOWN;
} else {
gender = Gender.UNKNOWN;
}
} catch (JSONException e) {
// an error occurred, handle this
}
...
Я удалил код обработки ошибок, так как вы можете обрабатывать его иначе, чем я. (Кроме того, «Пол» - это, конечно, класс, который я определил.) На данный момент вы можете использовать данные для чего угодно, например, для регистрации нового пользователя или поиска существующего пользователя для входа в систему. Обратите внимание, что « myfacebookappsecret "строка, конечно же, должна быть секретом вашего приложения от Facebook.
Вам понадобится пакет «org.json», чтобы использовать этот код, который вы можете найти по адресу: http://json.org/java/ (просто возьмите файлы .java и добавьте их в свой код в структуре папок org / json ).
Надеюсь, это поможет. Если что-то неясно, оставьте комментарий, и я обновлю ответ.
Ex animo, - Александр.
**** UPDATE ****
Я хочу добавить несколько кусочков информации, мои извинения, если что-то кажется излишним.
Чтобы войти в систему пользователя с помощью его / ее учетной записи Facebook, вам необходимо знать, о каком пользователе в хранилище данных мы говорим. Если это новый пользователь, просто создайте новый пользовательский объект (с полем с именем «facebookId» или как вы хотите его называть, значение которого вы получаете от Facebook), сохраните его в хранилище данных и войдите в систему.
Если пользователь существует, вам нужно иметь поле с facebookId. Когда пользователь перенаправлен из Facebook, вы можете взять facebookId и посмотреть в хранилище данных, чтобы найти пользователя, в которого вы хотите войти.
Если у вас уже есть пользователи, вам необходимо разрешить им входить в систему так, как вы обычно это делаете, чтобы вы знали, кто они, а затем отправить их в Facebook, вернуть facebookId и обновить объект пользователя. Таким образом, они могут войти через Facebook в следующий раз.
Еще одна небольшая заметка: пользователю будет представлен экран в Facebook с просьбой разрешить вашему приложению доступ к любым областям, о которых вы просите, и нет пути к этому (чем меньше областей, которые вы просите, тем менее навязчивым кажется, хоть). Однако это происходит только в первый раз, когда пользователь перенаправляется (если вы не запросите дополнительные области позже, он будет запрашивать снова).