0

我一直在 JSF 中使用社交身份验证 API,为了使用 facebook 登录,我不知道是否正确创建了会话。我已经从互联网上搜索了一些东西并进行了操作。现在我遇到了一些错误。

根据社交身份验证,首先我们需要调用一个函数,该函数有助于从 Facebook 获取身份验证 URL,我需要在其中创建一个会话并为其设置属性,一旦用户登录到 Facebook,就使用来自 facebook 的参数。

所以我的第一个视图页面将只包含一个调用相应功能的命令按钮。

            <h:form><h:commandButton value="submit" action="#{socialNetworkAuthentication.facebookAuthentication}"></h:commandButton></h:form>

然后调用的函数...

                 public String facebookAuthentication(){

    try{


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

 String propUrl="oauth_consumer.properties";


          //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(propUrl);

          //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://chennaivolunteers.com/ChennaiVolunteers/faces/cv/employee-profile.xhtml";


        // 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
          HttpServletRequest request=(HttpServletRequest) FacesContext.getCurrentInstance().getExternalContext().getRequest();
            HttpSession ses = request.getSession(true);

          ses.setAttribute("authManager", manager);
          System.out.println(url);
          FacesContext.getCurrentInstance().responseComplete();
       FacesContext.getCurrentInstance().getExternalContext().redirect(url);

        }

然后最后我重定向到 facebook 给出的相应 URL,在用户登录到 facebook 后,它会自动移动到上面代码中提到的 succesURL。

在我的successURL 中,我只有一个输出文本。

                          <tr><td class="profile-head"><h:outputText id="name" value="#{employeeProfile.profileName}" /></td></tr>
            <tr><td class="content-black">
            <div class="padding-2"><h:outputText id="name" value="#{employeeProfile.profileName}" />

在支持 bean 中,我创建了一个会话来获取我之前设置的属性。

                  public class EmployeeProfile {

public String profileName;

public String getProfileName() throws Exception  {

HttpServletRequest request=(HttpServletRequest) FacesContext.getCurrentInstance().getExternalContext().getRequest();
    HttpSession ses = request.getSession(true);
    SocialAuthManager m = (SocialAuthManager)ses.getAttribute("authManager");        
    AuthProvider provider = m.connect(SocialAuthUtil.getRequestParametersMap(request));
    Profile p = provider.getUserProfile();
      String userName=p.getFirstName();
      System.out.println(userName);

    return userName;

}

public void setProfileName(String profileName) {
    this.profileName = profileName;
}

当我在控制台中打印用户名时,它确实,但它不是这个支持 bean 的视图页面,已经赶上了如下两个异常。

             1.  javax.faces.FacesException: Could not retrieve value of component with path : {Component-Path : [Class: javax.faces.component.UIViewRoot,ViewId: /cv/employee-profile.xhtml][Class: javax.faces.component.html.HtmlOutputText,Id: name]}
           Caused by: javax.el.ELException: /cv/employee-profile.xhtml at line 133 and column 105 value="#{employeeProfile.profileName}": Error reading 'profileName' on type socialServlet.EmployeeProfile       


            2.javax.faces.FacesException: This is not the same SocailAuthManager object that was used for login.Please check if you have called getAuthenticationUrl() method before calling connect()
              Caused by: This is not the same SocailAuthManager object that was used for login.Please check if you have called getAuthenticationUrl() method before calling connect()

最后一个只是社交身份验证 API 的内置例外,但我认为这没有任何问题,因为当我使用 servlet 尝试时,一切正常,我认为在 JSF 会话中犯了一些错误。但我不知道我错在哪里。

4

1 回答 1

0

我的问题现在得到了纠正。我犯的错误是,我再次调用了 connect() 函数。现在我已经在构造函数本身中做了所有事情。它工作正常。

                public class EmployeeProfile {


public EmployeeProfile() throws Exception {
    // TODO Auto-generated constructor stub




        ExternalContext ectx = FacesContext.getCurrentInstance().getExternalContext();
        HttpServletRequest request = (HttpServletRequest)ectx.getRequest();
        HttpSession session = request.getSession(true);
         SocialAuthManager m = (SocialAuthManager)session.getAttribute("authManager"); 
         AuthProvider provider = m.connect(SocialAuthUtil.getRequestParametersMap(request));
         Profile p = provider.getUserProfile();
             String userName=p.getFirstName();    
              System.out.println(userName);
              setProfileName(userName);
              setBirthDate(p.getDob());
              setImageUrl(p.getProfileImageURL());
              p.getGender();


}
于 2011-12-03T06:28:45.060 回答