2010-11-07 2 views
2

Я использую LightOpenID, и в то время как это очень легкий, это не очень легко понять, и он не имеет вики ...простые OpenId в PHP

Пример файла они дают ниже (извините за удлиненный пост), что я не понимаю, почему он дважды создает экземпляр LightOpenID?

require 'openid.php'; 
try { 

    if(!isset($_GET['openid_mode'])) { // what is this about? 

     if(isset($_POST['openid_identifier'])) { 

      $openid = new LightOpenID; 

      $openid->identity = $_POST['openid_identifier']; 

      header('Location: ' . $openid->authUrl()); 
     } 
?> 
<form action="" method="post"> 
    OpenID: <input type="text" name="openid_identifier" /> <button>Submit</button> 
</form> 
<?php 
    } elseif($_GET['openid_mode'] == 'cancel') { 
     echo 'User has canceled authentication!'; 
    } else { 
     $openid = new LightOpenID; 
     echo 'User ' . ($openid->validate() ? $openid->identity . ' has ' : 'has not ') . 'logged in.'; 

    } 
} catch(ErrorException $e) { 
    echo $e->getMessage(); 
} 

Я пытаюсь добавить его в существующий сценарий here если кто-то действительно чувствует себя полезным. Как я могу сделать так, чтобы, когда $ openid-> validate() возвращает true, я могу сохранить $ sql_answer в базе данных?

+0

Посмотрите здесь. Я дал изменения, которые вам нужно сделать здесь. [http://stackoverflow.com/questions/3179193/php-lightopenid-how-to-fetch-account-data-from-provider/5270929#5270929](http://stackoverflow.com/questions/3179193/php- lightopenid-хау к выборкам-счет-данные-от-поставщика/5270929 # 5270929) –

ответ

3

В OpenID необходимо выполнить несколько запросов для всех вовлеченных сторон для завершения процедуры входа в систему; одного взаимодействия было бы недостаточно. В частности:

  1. Браузер запрашивает страницу входа в систему, вы отправляете форму (не установлены ни openid_identifier, ни openid_mode).
  2. Пользователь заполняет openid и отправляет. Вам необходимо начать транзакцию с провайдером, перенаправляя пользователя (openid_identifier из формы установлен, но openid_mode нет)
  3. Пользователь перенаправляется к провайдеру, регистрируется, а провайдер перенаправляет обратно на вашу страницу. Вам нужно подтвердить, что возвращаемые данные являются подлинными, а затем использовать идентификатор для фактического входа в систему пользователя (например, установить сеанс, обновить интерфейс и т. Д.) (Openid_mode будет установлен как «id_res», «cancel», так и «error»,).

Таким образом, два экземпляра LightOpenID фактически принадлежат отдельным HTTP-запросам для случаев 2 и 3; в случае 1 вам не нужен объект LightOpenID, так как вы показываете статическую форму.

2

Они обеспечивают вики: http://code.google.com/p/lightopenid/w/list

Там нет вешать, как два OpenID-объекты могут быть созданы с помощью сценария. Если вам не нравится, что $openid = new LightOpenID; дважды в вашем скрипте, просто напишите его один раз за if(isset($_POST['openid_identifier'])) {

Смежные вопросы