2011-12-05 34 views
2

使用提供的示例代码我可以使用我的Google帐户通过lightopenid登录到我的应用程序。我已将身份存储在cookie中,以便我的登录可以在会话中持续存在。使用lightopenid /注销保留登录信息

然后,我如何重新验证此ID以使其在用户浏览我的网站时保持登录状态?我想保留他们的名字显示在右上角/响应他们注销。

创建一个新的lightopenid对象,设置标识和调用validate()不起作用 - 我的lightopenid对象是一个没有太多内存的数组,而validate()返回false。

除此之外,我将如何编码一个链接,使用户能够注销?

登录代码(这是合作,共同为获得用户到我的网站):

$openID = new LightOpenID($_SERVER['HTTP_HOST']); 
    $openID -> required = array(
     'namePerson', 
     'namePerson/first', 
     'namePerson/last', 
     'contact/email' 
    ); 

    if (!$openID -> mode) { 
     // TRYING TO LOG IN 
     $openID -> identity = 'https://www.google.com/accounts/o8/id'; 
     redirect($openID -> authUrl()); 
    } else {    
     $page_data = array(
      "page_title"  => "Login", 
      "additional_css" => array(), 
      "additional_js" => array() 
     ); 

     if ($openID -> mode == "cancel") { 
      $login_error = array(
       "login_error" => "Google authentication cancelled" 
      ); 

      $this -> load -> view('global/header',$page_data); 
      $this -> load -> view('login/form',$login_error); 
      $this -> load -> view('global/footer'); 
     } else { 
      if ($openID -> validate()) { 
       $openID_identity = $openID -> identity; 
       $openID_data  = $openID -> getAttributes(); 
       $first_name  = $openID_data["namePerson/first"]; 
       $last_name  = $openID_data["namePerson/last"]; 
       $email   = $openID_data["contact/email"]; 

       $login = array(
        "first_name" => $first_name, 
        "last_name" => $last_name 
       ); 

       // SESSION COOKIE 
       $this -> session -> set_userdata(array(
        "user_id" => 0, 
        "identity" => $openID_identity, 
        "first_name" => $first_name, 
        "last_name" => $last_name, 
        "email"  => $email 
       )); 

       redirect("/login/welcome"); 
      } else { 
       $login_error = array(
        "login_error" => "Google authentication failed" 
       ); 

       $this -> load -> view('global/header',$page_data); 
       $this -> load -> view('login/form',$login_error); 
       $this -> load -> view('global/footer'); 
      } 
     }   
    } 
+1

你的代码看起来像一堆文本......也许这就是问题所在。 – stormdrain

+2

编辑一堆文本以添加文本墙。 – MikkyX

+0

啊!更好:)我没有使用过OA,但是从他们的文档粗略浏览看来,它需要智能模式来持久化身份验证,而Lightopenid只有“哑”模式。但是,如果您只想跟踪身份验证,则可以使用db会话并检查openID身份。使用db cookie作为用户名并在注销时删除cookie。 – stormdrain

回答

3

你应该使用一个会话机制(如PHP会话)。这样,你不必再次验证身份。

通常,为了再次验证标识符,您必须重复整个身份验证过程,这不是一个好主意。

您不能将用户从openid注销。但是,您可以删除会话,以便服务器不记得该用户已经登录(如果不使用openid,则完全相同)。

另外,请阅读附着在openid.php顶部的文档:

* Change the 'my-host.example.org' to your domain name. Do NOT use $_SERVER['HTTP_HOST'] 
* for that, unless you know what you are doing. 

当然,那就是,除非你真的了解使用它的安全隐患。

+0

CodeIgniter内置了会话类(基于数据库的或其他),因为该库可用,这可能比本地PHP会话更有意义。 http://codeigniter.com/user_guide/libraries/sessions.html – stormdrain