如何使用OAuth使用Facebook帐户登录Google App Engine的Java示例
我搜索了很多,阅读了许多博客,文章,教程,但直到现在还没有获得使用Facebook帐户登录我的应用程序的工作示例。
我知道我必须使用OAuth,获取令牌,授权等...
任何人都可以分享一个例子吗?
我搜索了很多,阅读了许多博客,文章,教程,但直到现在还没有获得使用Facebook帐户登录我的应用程序的工作示例。
我知道我必须使用OAuth,获取令牌,授权等...
任何人都可以分享一个例子吗?
以下是我在App Engine上的做法:
步骤1)在Facebook上注册“应用程序”(参见 https://developers.facebook.com/)。您为Facebook指定了应用程序的名称和URL。您注册的 url 是要处理登录的页面(jsp 或 servlet)的 url。从注册中,您将获得两个字符串,一个“应用程序ID”和一个“应用程序机密”(后者是您的密码,不要给出它或将其写在html中)。
对于此示例,假设我注册的 url 是“http://myappengineappid.appspot.com/signin_fb.do”。
2)从网页中,例如使用按钮,您将用户重定向到Facebook上的以下URL,在下面的示例中将您的应用程序ID替换为“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映射到以下 servlet:
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
}
...
我已经删除了错误处理代码,因为您可能希望以不同的方式处理它(另外,“Gender”当然是我定义的一个类。此时,您可以将数据用于所需的任何操作,例如注册新用户或查找要登录的现有用户。请注意,“myfacebookappsecret”字符串当然应该是您在Facebook上的应用程序秘密。
您将需要“org.json”包来使用此代码,您可以在以下位置找到:http://json.org/java/(只需获取.java文件并将其添加到org / json文件夹结构中的代码中)。
我希望这有帮助。如果有什么不清楚的地方,请发表评论,我会更新答案。
前阿尼莫, - 亚历山大.
更新****
我想补充一些信息,如果其中一些看起来有点过分,我很抱歉。
为了能够通过他/她的Facebook帐户登录用户,您需要知道我们正在谈论的数据存储中的哪个用户。如果是新用户,请轻松创建一个新的用户对象(带有一个名为“facebookId”的字段,或者您想要调用它的任何内容,您从Facebook获得其值),将其保留在数据存储中并使用户登录。
如果用户存在,则需要将字段与 facebookId 放在一起。当用户从Facebook重定向时,您可以获取facebookId,然后在数据存储中查找要登录的用户。
如果您已经有用户,则需要让他们以您通常的方式登录,以便您知道他们是谁,然后将他们发送到Facebook,取回facebookId并更新他们的用户对象。这样,他们下次就可以使用Facebook登录。
另一个小提示:用户将在Facebook上看到一个屏幕,要求允许你的应用访问你要求的任何范围,没有办法解决这个问题(你要求的范围越少,它看起来越不打扰)。但是,这仅在用户首次重定向时发生(除非您稍后请求更多作用域,否则它会再次询问)。
你可以试试face4j https://github.com/nischal/face4j/wiki。我们已经在我们的产品 http://grabinbox.com 上使用了它,并已将其开源供任何人使用。它在GAE上效果很好。
维基上有一个例子,应该可以帮助您在几分钟内将登录与Facebook集成。
face4j使用oAuth 2.0和Facebook graph API。