2011-02-09 3 views
3

POST 메서드를 사용하여 LightOpenID 라이브러리를 사용하여 인증하는 방법이 있습니까? 정확히 말하자면 인증 후 Google은 지정된 URL로 돌아가지만 GET 방식을 사용하여 모든 데이터가 나에게 전송되어 추악하고 긴 URL로 끝납니다.POST 메서드를 사용하여 LightOpenID 인증

내 코드는 다음과 같습니다 인증 OP는 이런 식으로 뭔가 보이는 URL을 반환

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) { 

} 

그래서 후 :

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

을 그리고는 영업 이익으로 돌아가려면 :

http://someurl.com/index.php 

을 입력하고 POST not GET을 사용하여 모든 데이터를 보냅니다.

+0

주요 관심사가 멋진 URL 인 경우 모든 데이터를 확보 한 후 끝점으로 리디렉션하십시오. LOID는 POST를 지원하지만, 모든 OID 공급자가 상당히 유연하지는 않습니다. – tadamson

+0

글쎄, 구글이 지원해야한다고 생각해. POST를 사용하려면 LOID에서 어떻게 지정합니까? – MeanEYE

답변

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

이렇게하면 사용자가 로그인하면 GET 대신 POST 메서드를 사용하여 모든 데이터를 반환합니까? – MeanEYE

+0

'$ fname = $ openid-> ret_fname(); $ lname = $ openid-> ret_lname(); $ email = $ openid-> ret_email(); ' fname, lname, email의 모든 값은이 PHP 변수에서 얻을 수 있습니다. 이제 당신은 U처럼 그들을 사용할 수 있습니다. 나는 당신의 세션에서 그들을 설정하는 것이 좋습니다. –

0

그것은이 질문에 가기 대답에 따라 불가능하다고 가능 : Response.Redirect with POST instead of Get?

다시 페이지 처리기에 구글에서 인증 응답이 아닌 "요청"수 있습니다 "리디렉션", 그래서 나는 아직도 확실하지 않다.

위의 POST를 사용하여 응답 한 후 자신을 리디렉션하는 것이 좋은 해결 방법 인 것 같습니다.

또 다른 해결책은 AJAX를 사용하여 전체 프로세스를 묻는 것일 수 있습니다.

관련 문제