JSF登录Facebook (SocialAuth)和保持会话存活



我被这个问题困扰了很长一段时间,我已经把我的问题重新表述了几次。我将明确地使用这个,提供下面的实现:


index.xhtml,短版本

...
<f:event listener="#{userBacking.pullUserInfo}" type="preRenderView" />
<h:commandLink action="#{userBacking.login()}"  value="Login"  rendered="#{!userBacking.isLoggedIn()}"/>
<h:commandLink action="#{userBacking.logout()}" value="Logout" rendered="#{userBacking.isLoggedIn()}" />
<h:outputText rendered="#{userBacking.isLoggedIn()}" value="#{userBacking.userProfile.fullName}" />
...


UserBacking.java

/**
 * 
 * @author ggrec
 *
 */
@ManagedBean
@SessionScoped
public class UserBacking implements Serializable
{
    // ==================== 2. Instance Fields ============================
    private static final long serialVersionUID = -2262690225818595135L;
    /**
     * This is static for now. In the future, Google (and others) may be implemented.
     */
    public static final String SOCIAL_PROVIDER_ID = "facebook"; //$NON-NLS-1$

    // ==================== 2. Instance Fields ============================
    private SocialAuthManager socialAuthManager;
    private Profile userProfile;

    // ==================== 6. Action Methods =============================
    public void login() throws Exception
    {
        final Properties props = System.getProperties();
        props.put("graph.facebook.com.consumer_key", FACEBOOK_APP_ID); //$NON-NLS-1$
        props.put("graph.facebook.com.consumer_secret", FACEBOOK_APP_SECRET); //$NON-NLS-1$
        props.put("graph.facebook.com.custom_permissions", "email"); //$NON-NLS-1$ //$NON-NLS-2$
        final SocialAuthConfig config = SocialAuthConfig.getDefault();
        config.load(props);
        socialAuthManager = new SocialAuthManager();
        socialAuthManager.setSocialAuthConfig(config);
        final String authenticationURL = socialAuthManager.getAuthenticationUrl(SOCIAL_PROVIDER_ID, successURL());
        ContextHelper.redirect(authenticationURL);
    }

    public void logout() throws Exception
    {
        socialAuthManager.disconnectProvider(SOCIAL_PROVIDER_ID);
        ContextHelper.invalidateSession();
    }
    /*
     * Should fill up the profile, if a redirect from Facebook appers. Uhhh....
     */
    public void pullUserInfo() throws Exception
    {
        if (userProfile == null && socialAuthManager != null)
        {
            final HttpServletRequest req = (HttpServletRequest) ContextHelper.ectx().getRequest();
            final Map<String, String> reqParam = SocialAuthUtil.getRequestParametersMap(req);
            final AuthProvider authProvider = socialAuthManager.connect(reqParam);
            userProfile = authProvider.getUserProfile();
            ContextHelper.redirect( ContextHelper.getContextPath() );
        }
    }

    // ==================== 7. Getters & Setters ======================
    public Profile getUserProfile()
    {
        return userProfile;
    }

    public boolean isLoggedIn()
    {
        return userProfile != null;
    }

    // ==================== 9. Convenience Methods ========================
    private static String successURL()
    {
        return IApplicationConstants.APP_PSEUDO_URL + ContextHelper.getContextPath();
    }
}


我的故事

    如果浏览器中不存在Facebook会话,
  • 可以正常工作。如果我已经登录,当请求参数中的code出现时,socialAuthManager似乎是NULL。

  • 我使用index.xhtml登录和回调

  • f:event在每次视图呈现时触发pullUserInfo(),希望当方法触发时,在请求参数中提供code。我知道这是错误的。

  • 这可以用过滤器来完成(即当Facebook调用code时)?

  • 我不是JSF的专家,所以我可能缺少一些基本的知识。


引用

  • Mr James -在JSF中使用SocialAuth实现Facebook登录

  • 如何使用SocialAuth与JSF重定向?

  • 这个非常漂亮的流程图

答案很简单,同时也很愚蠢。

会话丢失并在每个servlet请求中作为新创建

我从http://devel-win8:1381/app/login触发登录,但在http://dev-machine:1381/app/callback找到回调(这是一个不同的实现,使用servlet,但它也将与问题中的代码一起工作)。

浏览器为"裸"主机名创建不同的会话。

欢呼。

相关内容

  • 没有找到相关文章

最新更新