如何在Java EE项目中集成登录和facebook按钮



我想在我的Java EE web应用程序中集成一个"使用facebook登录"按钮。最好的方法是什么?

我使用的是jsf素数面3.5。谢谢

我一直在使用AuthenticRoast在Java EE应用程序中进行Facebook登录(JSF 2.1,已在GF 3/4上部署)。

来自他们的网站:

AuthenticRoast允许您构建高度灵活的身份验证Java Web层的机制。这可以是HTTP Basic中的任何内容身份验证到使用openid、facebook或您的公司的Kerberos设置。可以组合身份验证模块随意,甚至在运行时更改。

首先,您应该创建一个扩展ServletContextListener:的类

import javax.servlet.ServletContext;
import javax.servlet.ServletContextEvent;
import javax.servlet.ServletContextListener;
import name.aikesommer.authenticator.Registry;

public class ARDAppInit implements ServletContextListener
{
@Override
public void contextInitialized( ServletContextEvent sce )
{
ServletContext sc = null;
sc = sce.getServletContext();
// register AuthenticRoast authenticator extending CompositeAuthenticator 
Registry.forContext( sc ).register( new YouCustomAuthenticatorImpl());   
} 
@Override
public void contextDestroyed(ServletContextEvent sce) {

}
}

您应该在web.xml中创建一个监听器。

<listener>
<listener-class>it.elbuild.package.package.ARDAppInit</listener-class>
</listener>

然后,您应该提供一个验证器,定义一个扩展CompositeAuthenticator的类。类似于下面的类YouCustomAuthenticatorImpl。

import java.util.ArrayList;
import java.util.Collection;
import java.util.List;
import name.aikesommer.authenticator.CompositeAuthenticator;
import name.aikesommer.authenticator.LogoutManager;
import name.aikesommer.authenticator.PluggableAuthenticator;
/**
* 
* 
* @author ELbuild, web applications and more...
*/
public class YouCustomAuthenticatorImpl extends CompositeAuthenticator {
@Override
protected Collection<PluggableAuthenticator> createAuthenticators() {
List<PluggableAuthenticator> result = new ArrayList();
/**
* Allow form-based logins.
*/
result.add(new ARDFormAuthenticator());
/**
* Allow Facebook-based logins.
*/
result.add(new FacebookAuthenticator());
/**
* Allow a user to "logout".
*/
result.add(new LogoutManager());
return result;
}

}

我在这里粘贴的只是我用来处理FB身份验证的类,请看一下评论。如果你熟悉Facebook身份验证,这是不言自明的。关键是实现PluggableAuthenticator接口。

import com.google.gson.JsonObject;
import com.google.gson.JsonParser;
import it.elbuild.bjj.db.base.DAOFactory;
import it.elbuild.bjj.entities.Profile;
import java.io.UnsupportedEncodingException;
import java.net.URLEncoder;
import java.util.logging.Level;
import java.util.logging.Logger;
import name.aikesommer.authenticator.AuthenticationRequest;
import name.aikesommer.authenticator.PluggableAuthenticator;
import name.aikesommer.authenticator.SimplePrincipal;
import org.scribe.builder.ServiceBuilder;
import org.scribe.builder.api.FacebookApi;
import org.scribe.model.*;
import org.scribe.oauth.OAuthService;
/**
*
* @author ELbuild, web applications and more...
*/
public class FacebookAuthenticator extends PluggableAuthenticator {
private static final String PRINCIPAL_NOTE = PluggableAuthenticator.class.getName() + ".PRINCIPAL";
public static final String LOGIN_ACTION = "/j_facebook_login";
public static final String REDIRECT_ACTION = "/j_facebook_redirect";
public static final String CODE = "code";
OAuthService service = null;
/**
* Overwrite this to specify a different login-page.
*/
protected String getLoginPage() {
return "/login.jsp";
}
/**
* Overwrite this to specify a different error-page.
*/
protected String getErrorPage() {
return "/login-error.jsp";
}
protected String getRegisterPage() {
return "/register.xhtml";
}
protected String getRedirectPage(String url) throws UnsupportedEncodingException {
String encode = "ISO-8859-1";
String data = URLEncoder.encode(url, encode);

return "/social-login.xhtml?redirectto=" + data;
}
/**
* Overwrite this to specify a different path to direct to, if there is no
* original request.
*/
protected String getNextPath() {
return "/";
}
@Override
public AuthenticationRequest.Status tryAuthenticate(PluggableAuthenticator.AuthenticationManager manager, AuthenticationRequest request) {
if (manager.matchesRequest(request) && request.getSessionMap().containsKey(PRINCIPAL_NOTE)) {
manager.register(request, (SimplePrincipal) request.getSessionMap().get(PRINCIPAL_NOTE));
request.getSessionMap().remove(PRINCIPAL_NOTE);
manager.restoreRequest(request);
return AuthenticationRequest.Status.Success;
}
String requestURI = request.getRequestPath();
boolean loginAction = requestURI.endsWith(LOGIN_ACTION);
if (loginAction) {
String facebookId = checkCredentials(manager, request);
if (facebookId != null) {
request.getSessionMap().put(PRINCIPAL_NOTE, loadPrincipal(manager, request, facebookId));
String queryString = request.getHttpServletRequest().getQueryString();
if (queryString != null && queryString.length() > 0) {
manager.addQueryString(request, queryString);
}
if (manager.hasRequest(request)) {
manager.redirectToRequest(request);
} else {
manager.saveRequest(request, getNextPath());
manager.forward(request, getNextPath());
}
return AuthenticationRequest.Status.Continue;
}

manager.forward(request, getRegisterPage() + "?facebook=facebook");
return AuthenticationRequest.Status.Continue;
} else {
boolean redirectAction = requestURI.endsWith(REDIRECT_ACTION);
if (redirectAction) {
redirect(manager, request);
return AuthenticationRequest.Status.Continue;
}
}
return AuthenticationRequest.Status.None;
}
@Override
public AuthenticationRequest.Status authenticate(PluggableAuthenticator.AuthenticationManager manager, AuthenticationRequest request) {
manager.saveRequest(request);
manager.forward(request, getLoginPage());
return AuthenticationRequest.Status.Continue;
}
@Override
public AuthenticationRequest.ManageAction manage(PluggableAuthenticator.AuthenticationManager manager, AuthenticationRequest request) {
return AuthenticationRequest.ManageAction.None;
}
public void redirect(PluggableAuthenticator.AuthenticationManager manager, AuthenticationRequest request) {
try {
service = new ServiceBuilder()
.provider(FacebookApi.class)
.apiKey("YOUR API KEY HERE")
.apiSecret("YOUR API SECRET HERE")
.callback("YOUR CALLBACK HERE")
.debug()
.build();
// Obtain the Authorization URL
String url = service.getAuthorizationUrl(null);

manager.forward(request, getRedirectPage(url));
} catch (UnsupportedEncodingException ex) {
Logger.getLogger(FacebookAuthenticator.class.getName()).log(Level.SEVERE, null, ex);
}
}
public String checkCredentials(PluggableAuthenticator.AuthenticationManager manager, AuthenticationRequest request) {
String code = request.getParameter(CODE);
Verifier verifier = new Verifier(code);
// Trade the Request Token and Verfier for the Access Token
Token accessToken = service.getAccessToken(null, verifier);
System.out.println("Got the Access Token!");
System.out.println("(if your curious it looks like this: " + accessToken + " )");
System.out.println();
// Now let's go and ask for a protected resource!
System.out.println("Now we're going to access a protected resource...");
OAuthRequest orequest = new OAuthRequest(Verb.GET, "https://graph.facebook.com/me");
orequest.addBodyParameter("get", "name");
service.signRequest(accessToken, orequest);
Response response = orequest.send();
System.out.println("Got it! Lets see what we found...");
System.out.println();
System.out.println(response.getBody());
JsonParser parser = new JsonParser();
JsonObject authData = parser.parse(response.getBody()).getAsJsonObject();

String facebookId = authData.getAsJsonPrimitive("id").getAsString();
Profile p = null;
if (facebookId != null) {
p = DAOFactory.getProfileDAO().findByFacebookId(facebookId);
}
if (p == null) {
return null;
} else {
return facebookId;
}
}
protected SimplePrincipal loadPrincipal(AuthenticationManager manager, AuthenticationRequest request, String facebookId) {
Profile p = DAOFactory.getProfileDAO().findByFacebookId(facebookId);
return new SimplePrincipal(p.getUserName(), p.getUserRole());
}
}

最新更新