JSP(tomcat)中的Facebook Connect示例 [英] Facebook Connect example in JSP (tomcat)
问题描述
- 我的站点上未经身份验证/未注册的用户点击Facebook Connect按钮注册(捕获电子邮件,姓名和个人资料ID)并登录。
- 未经身份验证的用户点击Facebook Connect按钮在我的域上创建有效的会话。
- 没有连接的Facebook个人资料的身份验证和注册用户点击Facebook Connect,并将Facebook个人资料ID(以及更新其电子邮件和名称的选项)与现有个人资料相关联。
对于这个项目,我有一个Profile类,看起来像这样(我使用的是非常好的 Project Lombok with Hibernate)
@Entity
@Data
public class Profile implements java.io.Serializable {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private long id;
private String username;
私人字符串密码;
private String displayName;
私人字符串电子邮件;
private String zipCode;
private String mobileNumber;
private String facebookId;
@Type(type =org.jadira.usertype.dateandtime.joda.PersistentDateTime)
private DateTime dateCreated;
private int status;
private int level;
}
状态和级别真的应该是枚举,但我试图保持
免责声明:我一直在阅读很多关于如何为用户设置Facebook Connect的博客注册和身份验证,但它们大部分是基于PHP和旧版本的Facebook API(甚至一些SO问题指向旧wiki在他们公认的答案)。这似乎是SO社区的完美应用程序。
这是我使用的servlet解决方案。通过很少的调整,您可以使用简单的用户名密码表单在任何JSP中进行调试。不需要JavaScript!
至于地址和电话号码,请阅读:
http:// developers.facebook.com/blog/post/447
FBAuthServlet
public class FBAuthServlet extends HttpServlet {
private static final Logger log = Logger.getLogger(FBAuthServlet.class);
private static final long serialVersionUID = 1L;
private UserService userService = //这里是您的用户服务实现
public FBAuthServlet(){
super();
}
public void destroy(){
super.destroy(); //将log中的destroy字符串放入
//将代码放在
}
public void doGet(HttpServletRequest request,HttpServletResponse response)
throws ServletException, IOException {
HttpServletRequest req =(HttpServletRequest)请求;
HttpServletResponse res =(HttpServletResponse)响应;
if(y.equals(request.getParameter(FacebookLogin))){
response.sendRedirect(FaceBookConfig.getLoginRedirectURL());
返回;
}
String code = req.getParameter(code);
if(StringUtil.isNotBlankStr(code)){
String authURL = FaceBookConfig.getAuthURL(code);
URL url = new URL(authURL);
try {
String result = readURL(url);
String accessToken = null;
整数expires = null;
String [] pairs = result.split(&);
for(String pair:pairs){
String [] kv = pair.split(=);
if(kv.length!= 2){
res.sendRedirect(FaceBookConfig.MAINURL);
} else {
if(kv [0] .equals(access_token)){
accessToken = kv [1];
}
if(kv [0] .equals(expires)){
expires = Integer.valueOf(kv [1]);
}
}
}
如果(accessToken!= null&& expires!= null){
用户用户= authFacebookLogin(accessToken,request.getRemoteAddr());
if(user!= null&&&&user.getFacebookId()!= null){
//转发到spring安全过滤器链
res.sendRedirect(FaceBookConfig.MAINURL +/ j_spring_security_check?j_username =+ user.getEmail()+& FaceBookId =+ user.getFacebookId());
} else if(user!= null&& StringUtil.isNullOrBlank(user.getFacebookId())){
res.sendRedirect(FaceBookConfig.MAINURL +/login.html?login_error=你是没有注册Facebook Connect);
} else {
res.sendRedirect(FaceBookConfig.MAINURL);
}
}
} catch(Exception e){
e.printStackTrace();
res.sendRedirect(FaceBookConfig.MAINURL);
}
}
public void doPost(HttpServletRequest request,HttpServletResponse response)
throws ServletException,IOException {
doGet(请求,响应);
}
public void init()throws ServletException {
}
private String readURL(URL url)throws IOException {
ByteArrayOutputStream baos = new ByteArrayOutputStream();
InputStream is = url.openStream();
int r;
while((r = is.read())!= -1){
baos.write(r);
}
return new String(baos.toByteArray());
}
私人用户authFacebookLogin(String accessToken,String ip){
try {
String content = IOUtil.urlToString(new URL(https ://graph.facebook.com/me?access_token =+ accessToken));
JSONObject resp = new JSONObject(content);
String.com id =
String firstName = resp.getString(first_name);
String lastName = resp.getString(last_name);
String email = resp.getString(email);
log.info(Facebook回复:+内容);
CreateUserRequestCommand comm = new CreateUserRequestCommand();
comm.setEmail(email);
comm.setFacebookId(facebookid);
comm.setFirst(StringAndDateUtils.safeChar(firstName));
comm.setLast(StringAndDateUtils.safeChar(lastName));
//如果成功登录
if(userService.getUserByEmail(email)== null){
//如果第一次登录
用户u = userService.createUser(comm,ip );
return u;
} else {//如果存在
用户existsedUser = userService.getUserByEmail(email);
return existsedUser;
}
} catch(Throwable ex){
ex.printStackTrace();
}
返回null;
}
}
FBEnableServlet
public class FBEnableServlet extends HttpServlet {
private static final long serialVersionUID = 1L;
private UserService userService =(UserService)ServiceLocator.getContext()。getBean(userService);
public FBEnableServlet(){
super();
}
public void destroy(){
super.destroy(); //将log中的destroy字符串放入
//将代码放在
}
public void doGet(HttpServletRequest request,HttpServletResponse response)
throws ServletException, IOException {
HttpServletRequest req =(HttpServletRequest)请求;
HttpServletResponse res =(HttpServletResponse)响应;
if(y.equals(request.getParameter(EnableFacebookConnect))){
response.sendRedirect(FaceBookConfig.getEnableRedirectURL());
返回;
}
String code = req.getParameter(code);
if(StringUtil.isNotBlankStr(code)){
String authURL = FaceBookConfig.getEnableAuthURL(code);
URL url = new URL(authURL);
try {
String result = readURL(url);
String accessToken = null;
整数expires = null;
String [] pairs = result.split(&);
for(String pair:pairs){
String [] kv = pair.split(=);
if(kv.length!= 2){
res.sendRedirect(FaceBookConfig.MAINURL);
} else {
if(kv [0] .equals(access_token)){
accessToken = kv [1];
}
if(kv [0] .equals(expires)){
expires = Integer.valueOf(kv [1]);
}
}
}
如果(accessToken!= null&& expires!= null){
用户user = authFacebookLogin(accessToken, request.getRemoteAddr());
String loginedEmail =;
try {
loginedEmail = SecurityContextHolder.getContext()。getAuthentication()。getName();
} catch(Exception ex){
}
System.out.println(Logined email =+ loginedEmail);
System.out.println(Facebook Login email =+ user.getEmail());
if(user!= null&& user.getFacebookId()!= null&& user.getEmail()。equals(loginedEmail)){
userService.setFaceBookid(user.getFacebookId ));
//转发到spring安全过滤器链
res.sendRedirect(FaceBookConfig.MAINURL +/ j_spring_security_check?j_username =+ user.getEmail()+& FaceBookId =+ user.getFacebookId() );
} else {
res.sendRedirect(FaceBookConfig.MAINURL +/secure/myAccount.html?message=请使用相同的电子邮件登录Facebook,您使用+ user.getEmail()登录);
}
}
} catch(Exception e){
e.printStackTrace();
res.sendRedirect(FaceBookConfig.MAINURL);
}
}
public void doPost(HttpServletRequest request,HttpServletResponse response)
throws ServletException,IOException {
doGet(请求,响应);
}
public void init()throws ServletException {
}
private String readURL(URL url)throws IOException {
ByteArrayOutputStream baos = new ByteArrayOutputStream();
InputStream is = url.openStream();
int r;
while((r = is.read())!= -1){
baos.write(r);
}
return new String(baos.toByteArray());
}
私人用户authFacebookLogin(String accessToken,String ip){
try {
String content = IOUtil.urlToString(new URL(https ://graph.facebook.com/me?access_token =+ accessToken));
JSONObject resp = new JSONObject(content);
String.com id =
String email = resp.getString(email);
用户existsedUser = userService.getUserByEmail(email);
if(existsedUser == null){
return null;
} else {
existsedUser.setFacebookId(serve)
return existsedUser;
}
} catch(Throwable ex){
ex.printStackTrace();
}
返回null;
}
}
I'm building a JSP application and I would like to use Facebook Connect as one path for user registration and authentication, but I'm not finding much information about how to fetch and parse the FB cookie or even the right flow. I'm trying to merge the information found in the official documentation with a step by step guide like this one but for Java. I am not opposed to relying on libraries like Social Java but understanding the steps would be helpful. Here are the 3 use cases I'm trying to satisfy.
- Unauthenticated/unregistered user on my site clicks on "Facebook Connect" button to sign up (capturing email, name and profile ID) and and sign in.
- Unauthenticated user clicks on ""Facebook Connect" button to create a valid session on my domain.
- Authenticated and registered user without a connected Facebook profile clicks on "Facebook Connect" and associates a Facebook profile ID (and the option to update their email and name) with their existing profile.
For this project I have a Profile class that looks like this (I'm using the excellent Project Lombok with Hibernate)
@Entity
@Data
public class Profile implements java.io.Serializable {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private long id;
private String username;
private String password;
private String displayName;
private String email;
private String zipCode;
private String mobileNumber;
private String facebookId;
@Type(type = "org.jadira.usertype.dateandtime.joda.PersistentDateTime")
private DateTime dateCreated;
private int status;
private int level;
}
Status and Level really should be enums, but I'm trying to keep the code tiny for this question.
Disclaimer:I've been reading a lot of blogs about how to setup Facebook Connect for user registration and authentication, but they are for the most part based on PHP and older versions of the Facebook API (even some SO questions point to the old wiki in their accepted answers). This seems like a perfect application of the SO community.
Here is servlet solution I use. With little tweaking you can meke it work in any JSP with simple username-password form. No javascript needed!!! As far as address and phone number go read this: http://developers.facebook.com/blog/post/447
FBAuthServlet
public class FBAuthServlet extends HttpServlet {
private static final Logger log = Logger.getLogger(FBAuthServlet.class);
private static final long serialVersionUID = 1L;
private UserService userService = //here goes your user service implementation
public FBAuthServlet() {
super();
}
public void destroy() {
super.destroy(); // Just puts "destroy" string in log
// Put your code here
}
public void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
HttpServletRequest req = (HttpServletRequest) request;
HttpServletResponse res = (HttpServletResponse) response;
if ("y".equals(request.getParameter("FacebookLogin"))) {
response.sendRedirect(FaceBookConfig.getLoginRedirectURL());
return;
}
String code = req.getParameter("code");
if (StringUtil.isNotBlankStr(code)) {
String authURL = FaceBookConfig.getAuthURL(code);
URL url = new URL(authURL);
try {
String result = readURL(url);
String accessToken = null;
Integer expires = null;
String[] pairs = result.split("&");
for (String pair : pairs) {
String[] kv = pair.split("=");
if (kv.length != 2) {
res.sendRedirect(FaceBookConfig.MAINURL);
} else {
if (kv[0].equals("access_token")) {
accessToken = kv[1];
}
if (kv[0].equals("expires")) {
expires = Integer.valueOf(kv[1]);
}
}
}
if (accessToken != null && expires != null) {
User user = authFacebookLogin(accessToken, request.getRemoteAddr());
if (user != null && user.getFacebookId() != null) {
//forward to spring security filter chain
res.sendRedirect(FaceBookConfig.MAINURL + "/j_spring_security_check?j_username=" + user.getEmail() + "&FaceBookId=" + user.getFacebookId());
} else if (user != null && StringUtil.isNullOrBlank(user.getFacebookId())) {
res.sendRedirect(FaceBookConfig.MAINURL + "/login.html?login_error=You are not Registered By Facebook Connect");
} else {
res.sendRedirect(FaceBookConfig.MAINURL);
}
}
} catch (Exception e) {
e.printStackTrace();
res.sendRedirect(FaceBookConfig.MAINURL);
}
}
}
public void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
doGet(request, response);
}
public void init() throws ServletException {
}
private String readURL(URL url) throws IOException {
ByteArrayOutputStream baos = new ByteArrayOutputStream();
InputStream is = url.openStream();
int r;
while ((r = is.read()) != -1) {
baos.write(r);
}
return new String(baos.toByteArray());
}
private User authFacebookLogin(String accessToken, String ip) {
try {
String content = IOUtil.urlToString(new URL("https://graph.facebook.com/me?access_token=" + accessToken));
JSONObject resp = new JSONObject(content);
String facebookid = resp.getString("id");
String firstName = resp.getString("first_name");
String lastName = resp.getString("last_name");
String email = resp.getString("email");
log.info("Facebook response: " + content);
CreateUserRequestCommand comm = new CreateUserRequestCommand();
comm.setEmail(email);
comm.setFacebookId(facebookid);
comm.setFirst(StringAndDateUtils.safeChar(firstName));
comm.setLast(StringAndDateUtils.safeChar(lastName));
//if success login
if (userService.getUserByEmail(email) == null) {
//if first time login
User u = userService.createUser(comm, ip);
return u;
} else {//if existed
User existedUser = userService.getUserByEmail(email);
return existedUser;
}
} catch (Throwable ex) {
ex.printStackTrace();
}
return null;
}
}
FBEnableServlet
public class FBEnableServlet extends HttpServlet {
private static final long serialVersionUID = 1L;
private UserService userService = (UserService) ServiceLocator.getContext().getBean("userService");
public FBEnableServlet() {
super();
}
public void destroy() {
super.destroy(); // Just puts "destroy" string in log
// Put your code here
}
public void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
HttpServletRequest req = (HttpServletRequest) request;
HttpServletResponse res = (HttpServletResponse) response;
if ("y".equals(request.getParameter("EnableFacebookConnect"))) {
response.sendRedirect(FaceBookConfig.getEnableRedirectURL());
return;
}
String code = req.getParameter("code");
if (StringUtil.isNotBlankStr(code)) {
String authURL = FaceBookConfig.getEnableAuthURL(code);
URL url = new URL(authURL);
try {
String result = readURL(url);
String accessToken = null;
Integer expires = null;
String[] pairs = result.split("&");
for (String pair : pairs) {
String[] kv = pair.split("=");
if (kv.length != 2) {
res.sendRedirect(FaceBookConfig.MAINURL);
} else {
if (kv[0].equals("access_token")) {
accessToken = kv[1];
}
if (kv[0].equals("expires")) {
expires = Integer.valueOf(kv[1]);
}
}
}
if (accessToken != null && expires != null) {
User user = authFacebookLogin(accessToken, request.getRemoteAddr());
String loginedEmail = "";
try {
loginedEmail = SecurityContextHolder.getContext().getAuthentication().getName();
} catch (Exception ex) {
}
System.out.println("Logined email = " + loginedEmail);
System.out.println("Facebook Login email = " + user.getEmail());
if (user != null && user.getFacebookId() != null && user.getEmail().equals(loginedEmail)) {
userService.setFaceBookid(user.getFacebookId());
//forward to spring security filter chain
res.sendRedirect(FaceBookConfig.MAINURL + "/j_spring_security_check?j_username=" + user.getEmail() + "&FaceBookId=" + user.getFacebookId());
} else {
res.sendRedirect(FaceBookConfig.MAINURL + "/secure/myAccount.html?message=Please login Facebook with same Email,you Login with " + user.getEmail());
}
}
} catch (Exception e) {
e.printStackTrace();
res.sendRedirect(FaceBookConfig.MAINURL);
}
}
}
public void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
doGet(request, response);
}
public void init() throws ServletException {
}
private String readURL(URL url) throws IOException {
ByteArrayOutputStream baos = new ByteArrayOutputStream();
InputStream is = url.openStream();
int r;
while ((r = is.read()) != -1) {
baos.write(r);
}
return new String(baos.toByteArray());
}
private User authFacebookLogin(String accessToken, String ip) {
try {
String content = IOUtil.urlToString(new URL("https://graph.facebook.com/me?access_token=" + accessToken));
JSONObject resp = new JSONObject(content);
String facebookid = resp.getString("id");
String email = resp.getString("email");
User existedUser = userService.getUserByEmail(email);
if (existedUser == null) {
return null;
} else {
existedUser.setFacebookId(facebookid);
return existedUser;
}
} catch (Throwable ex) {
ex.printStackTrace();
}
return null;
}
}
这篇关于JSP(tomcat)中的Facebook Connect示例的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!