2013-04-11 2 views
0

Я предпочитаю не писать свою собственную функцию входа, поэтому вместо этого я хотел бы использовать openId. Я нашел библиотеку lightopenid и с некоторыми изменениями в Google, например файл выглядит следующим образом:Можно ли использовать openId?

<?php 
session_start(); 
# Logging in with Google accounts requires setting special identity, so this example shows how to do it. 
require 'openid.php'; 
try { 
    # Change 'localhost' to your domain name. 
    $openid = new LightOpenID('127.0.0.1'); 
    if(!$openid->mode) { 
     if(isset($_GET['login'])) { 
      $openid->identity = 'https://www.google.com/accounts/o8/id'; 
      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 { 
     echo 'User ' . ($openid->validate() ? $openid->identity . ' has ' : 'has not ') . 'logged in.'; 
     if ($openid->validate()) { 
      $_SESSION['auth'] = true; 
     } 
    } 
} catch(ErrorException $e) { 
    echo $e->getMessage(); 
} 

Так что я добавил $ _SESSION вещь там ... Теперь думаю, может использовать код на верху каждого защищенные страницы, как это:

<?php session_start(); 
if (!$_SESSION['auth']) { exit; } ?> 

Я хочу, чтобы это было сделано правильно, так что это все безопасно и так далее. Вы бы это сделали, или я делаю что-то неправильно? Я мог бы использовать файлы cookie вместо этого ...

+0

Не совсем уверен в ваших сомнениях, но надеюсь, вы даже не рассматриваете идею хранения файла 'auth = true' cookie ... Тривиально редактировать файлы cookie из браузера. Кроме того, вас не интересует, кто такой пользователь? До сих пор любой, у кого есть учетная запись Google, может войти на ваш сайт, и вы даже не храните '$ openid-> identity'. –

+0

Что содержит идентификатор $ openid->? если я повторяю это, он ничего не печатает ... – theva

ответ

1

Я не пробовал ваш код, но если он основан на bundled Google example, все должно быть хорошо. Конечно, с этим кодом ваш сайт не открыт для любого владельца OpenID, а только для пользователей Google.

Однако, как вы уже отметили, LightOpenID только берет на себя процесс аутентификации, поэтому вашему приложению необходимо собирать и хранить необходимые данные аутентификации, потому что было бы больно повторять проверку подлинности на каждом запросе страницы. Самым важным является тождество. Идентификатор - это URL-адрес, и он эквивалентен OpenID «login» или «username». Как объясняет "Configuracion" wiki page, вам нужно получить его от $openid->identity до после успешной проверки, когда он изменится с https://www.google.com/accounts/o8/id на любой уникальный URL, присвоенный пользователю Google. Вероятно, вы хотите это знать:

  • Вы можете назначить разные разрешения для разных пользователей.
  • Вы можете идентифицировать пользователя на разных сеансах.

Теперь, как сохранить личность?

  • Использование файла cookie для определения того, является ли пользователь аутентифицированным, является наихудшим возможным решением. Вам не нужно быть хакером, чтобы сломать это - все современные браузеры включают простые в использовании инструменты графического интерфейса для редактирования файлов cookie.

  • Сессии на стороне сервера являются отраслевым стандартом. После моего замечания о личности, я бы хранить хотя бы это:

    $_SESSION['openid'] = $openid->identity; 
    
  • В дополнение к сессиям, вам нужна база данных, если данные пользователя можно создавать потребности сохраняться между сеансами. (Это зависит от ваших потребностей.)

Edit:

Вы не можете проверить дважды, потому что запрос истекает. Это механизм безопасности. Храните его в переменной, если вам нужно его повторно использовать:

$is_valid = $openid->validate(); 
echo 'User ' . ($is_valid ? $openid->identity . ' has ' : 'has not ') . 'logged in.'; 
if ($is_valid) { 
    $_SESSION['auth'] = true; 
} 
+0

Значит, вы говорите мне, что информация для входа обычно хранится в сеансах, а не в файлах cookie? Раньше я использовал сеансы, потому что я должен был лениться, чтобы начать понимать куки (как я учил, это правильный способ сделать). – theva

+0

Я нашел интересную ошибку, кажется, что первый вызов для проверки (тот, который возвращает текст) возвращает TRUE, а второй (который устанавливает сеанс) возвращает FALSE. Как это может быть? – theva

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