2013-02-28 2 views
2

Я пытаюсь использовать SocialAuth, идея очень проста, нажмите на log in с Facebook затем перенаправить пользователя на свой веб-сайт, подписанный в log in часть я понял, что ниже:.Как использовать SocialAuth с JSF для перенаправления?

1)/index.xhtml

<h:form id="login-facebook"> 
    <h:commandButton id="login" action="#{socialFacebook.login}" value="Login"/> 
</h:form> 

2) socialFacebook фасоли

package controller; 


@ManagedBean(name="socialFacebook") 
@RequestScoped 
public class SocialFacebook implements Serializable{ 
    private static final long serialVersionUID = -4787254243136316495L; 

    private String code; 

    @PostConstruct 
    public void init(){ 
     try { 
      HttpServletRequest request=(HttpServletRequest) FacesContext.getCurrentInstance().getExternalContext().getRequest(); 
      SocialAuthManager manager = (SocialAuthManager)FacesContext.getCurrentInstance().getExternalContext().getSessionMap().get("authManager"); 
      Map<String, String> paramsMap = SocialAuthUtil.getRequestParametersMap(request); 
      AuthProvider provider = manager.connect(paramsMap); 

      // get profile 
      Profile p = provider.getUserProfile(); 
      System.out.println(p.getFullName()); 
     } catch (Exception e) { 
      // TODO Auto-generated catch block 
      e.printStackTrace(); 
     } 
    } 

    public void login(){ 
     try { 
      HttpServletRequest request=(HttpServletRequest) FacesContext.getCurrentInstance().getExternalContext().getRequest(); 

      //Create an instance of SocialAuthConfig object 
      SocialAuthConfig config = SocialAuthConfig.getDefault(); 

      //load configuration. By default load the configuration from oauth_consumer.properties. 
      //You can also pass input stream, properties object or properties file name. 
      config.load(); 

      //Create an instance of SocialAuthManager and set config 
      SocialAuthManager manager = new SocialAuthManager(); 
      manager.setSocialAuthConfig(config); 

      //URL of YOUR application which will be called after authentication 
      //String successUrl = "http://localhost:8080/cc/pages/system/login_facebook.xhtml" + ";jsessionid=" + req.getSession().getId(); 
      String successUrl = "http://localhost:8080/cc/pages/system/index.xhtml" + ";jsessionid=" + request.getSession().getId(); 

      // get Provider URL to which you should redirect for authentication. 
      // id can have values "facebook", "twitter", "yahoo" etc. or the OpenID URL 
      String url = manager.getAuthenticationUrl("facebook", successUrl); 

      // Store in session 
      FacesContext.getCurrentInstance().getExternalContext().getSessionMap().put("authManager", manager);     
      //redirect to the successful login page 
      FacesContext.getCurrentInstance().responseComplete(); 
      FacesContext.getCurrentInstance().getExternalContext().redirect(url); 

     } catch (Exception e) { 
      // TODO Auto-generated catch block 
      e.printStackTrace(); 
     } 
    } 


    public String getCode() { 
     return code; 
    } 

    public void setCode(String code) { 
     this.code = code; 
    } 

    } 

3) Facebook возвращается следующий URL:

http://localhost:8080/cc/pages/system/home_facebook.xhtml;jsessionid=e143aa975fa3f313c677fbcb03e3?code=AQAmJXdQX0B__zJHXnRyPfgaG1CfNUEEEEEEEEEEEEEEEZJLEpsT5s1spd3KtWGWI2HYaIOZKLkrn8axKs4iKwJVQJwJQB_WSs2iWkp2DDDDDDDDDDDDtdRPLPG7psp6r2PYmn7CTm2QNNha7f1QlgmoZtBsIEF0SSSSSSSSSSSSSSSSSSSSSSS8RutAU8dqI2KDE57f#_=_ 

4) Он проходит мимо моего метода инициализации, как BalusC предложить, но всегда печатает nope :(:

@ManagedBean(name="redirectFacebook") 
@RequestScoped 
public class RedirectFacebook implements Serializable{ 
    private static final long serialVersionUID = -566276017320074630L; 

    private String code; 
    private Profile profile; 


    @PostConstruct 
    public void init(){ 
     try { 
      HttpServletRequest request=(HttpServletRequest) FacesContext.getCurrentInstance().getExternalContext().getRequest(); 
      HttpSession session = (HttpSession) request.getAttribute("jsessionid"); 

      if (request.getAttribute("code") != null) 
       System.out.println("code"); 
      else 
       System.out.println("nope :("); 

      if (session != null){ 
       SocialAuthManager manager = (SocialAuthManager)FacesContext.getCurrentInstance().getExternalContext().getSessionMap().get("authManager"); 
       Map<String, String> paramsMap = SocialAuthUtil.getRequestParametersMap(request); 
       AuthProvider provider = manager.connect(paramsMap); 

       // get profile 
       profile = provider.getUserProfile(); 
       System.out.println(profile.getFullName()); 
      } 
     } catch (Exception e) { 
      // TODO Auto-generated catch block 
      e.printStackTrace(); 
     } 
    } 

5) И он печатает nope :( тоже на моей странице home_facebook:

<h:form id="redirect-facebook-form"> 
    <f:metadata> 
     <f:viewParam name="code" value="#{redirectFacebook.code}" /> 
    </f:metadata> 
    <h:panelGroup rendered="#{not empty redirectFacebook.profile}"> 
     Hello, you're successfully associated as #{socialFacebook.profile.firstName} on Facebook 
    </h:panelGroup> 
    <h:panelGroup rendered="#{empty redirectFacebook.profile}"> 
     Nope :(
    </h:panelGroup> 
</h:form> 

Но, Я немного смущаюсь, как получить результат в моем компоненте и сделать некоторые проверки, как если бы пользователь зарегистрировался или нет, например. Я знаю, глядя на какой-то код в Google, что я должен это сделать, но как я могу перенаправить на свой bean-компонент и сделать это и перенаправить пользователя на нужную страницу?

SocialAuthManager manager = (SocialAuthManager)FacesContext.getCurrentInstance().getExternalContext().getSessionMap().get("authManager"); 
    Map<String, String> paramsMap = SocialAuthUtil.getRequestParametersMap(request); 
    AuthProvider provider = manager.connect(paramsMap); 

    // get profile 
    Profile p; 
    p = provider.getUserProfile(); 

Это действительно займет несколько ночей, чтобы понять это. Любая идея очень уязвлена, спасибо.

+0

Самый простой способ будет выполнять задание в (post) конструкторе объекта с запросом/представлением, связанным с страницей обратного вызова 'home.xhtml'. Вы пробовали это? – BalusC

+0

Да, я сделал, 'request' я всегда' NULL'. Как связать страницу обратного вызова с компонентом? –

+0

Просто укажите bean-страницу где-нибудь на странице, например. ' Привет, вы успешно связаны как # {socialAuthBean.profile.username} в Facebook' и так далее. Или, используя ''. – BalusC

ответ

0

Я не вижу проблемы с уровнем кода, кроме того, что вы используете localhost в URL. Вот wiki link, в котором описывается, как запускать приложение с localhost.

Пожалуйста, дайте мне знать, если это не сработает.