2011-02-09 49 views
3

有沒有使用POST方法使用LightOpenID庫進行身份驗證的方法?確切地說,在進行身份驗證後,Google(例如)返回到指定的URL,但所有數據都使用GET方法發送給我,這會以醜陋和長的URL結束。使用POST方法的LightOpenID身份驗證

我的代碼是:

所以經過
define('BASE_URL', 'http://someurl.com'); 

try { 
    $openid = new LightOpenID(); 

    if (!isset($_GET['openid_mode'])) { 
     // no openid mode was set, authenticate user 
     $openid->identity = 'https://www.google.com/accounts/o8/id'; 
     $openid->realm = BASE_URL; 
     $openid->required = array('contact/email'); 

     header('Location: '.$openid->authUrl()); 

    } else if ($_GET['openid_mode'] == 'cancel') { 
     // user canceled login, redirect them 
     header('Location: '.BASE_URL); 

    } else { 
     // authentication completed, perform license check 
     if ($openid->validate()) { 
      $openid->getAttributes(); 
     } 
    } 

} catch (ErrorException $e) { 

} 

認證OP返回到URL,它看起來是這樣的:

http://someurl.com/index.php?openid.ns=http://specs.openid.net/auth/2.0&openid.mode=id_res&openid.op_endpoint=https://www.googl... 

我想OP返回:

http://someurl.com/index.php 

並使用POST not GET發送所有數據。

+0

如果您主要關心的是網址看起來不錯,只需在抓取所有數據後將您的端點重定向到一個理智的位置即可。雖然LOID支持POST,但我懷疑每個OID提供者都非常靈活。 – tadamson 2011-02-09 16:13:16

+0

嗯,我認爲谷歌應該是支持它的。你如何在LOID中指定使用POST? – MeanEYE 2011-02-10 10:03:40

回答

1

我一直在努力。請參閱下面的代碼。我認爲這應該有所幫助。

<?php 
require 'lightopenid/openid.php'; 
try { 
    $openid = new LightOpenID;      
    if(!$openid->mode) { 
     if(isset($_GET['login'])) { 
      $openid->identity = 'https://www.google.com/accounts/o8/site-xrds?hd=yourdomain.com';   
     $openid->required = array('namePerson/friendly', 'contact/email' , 'contact/country/home', 'namePerson/first', 'pref/language', 'namePerson/last'); 
      header('Location: ' . $openid->authUrl());  
     } 
?> 
<form action="?login" method="post"> 
    <button>Login with Google</button> 
</form> 
<?php 
    } elseif($openid->mode == 'cancel') { 
     echo 'User has canceled authentication !'; 
    } else { 
     session_start(); 
     $fname = $openid->ret_fname();      // setting session 
     $lname = $openid->ret_lname();      // setting session 
     $email = $openid->ret_email();      // setting session 
     $_SESSION['admin']['name'] = $fname.' '.$lname;  // setting session 
     $_SESSION['admin']['emailID'] = $email;    // setting session 

     header('Location:approve.php'); // PUT YOUR PAGE/URL HERE.... I THINK THIS SHOULD DO THE TRICK !!! 
    } 
} catch(ErrorException $e) { 
    echo $e->getMessage(); 
} 
0

這是可能的,這是不可能的,根據上面這個問題的答案:Response.Redirect with POST instead of Get?

從谷歌回到你的頁面處理程序認證響應可能是一個「請求」,而不是「重定向」,所以我仍然不確定。

如上所述使用POST進行響應後重定向自己似乎是一種很好的解決方法。

另一種解決方案可能是使用AJAX來掩埋整個過程。