Как аутентифицировать сторонний веб-сайт с помощью вызова iframe


Я работаю с колледжем и должен интегрировать свои курсы - чтобы их студенты могли получить доступ к нему на веб-сайте колледжа. Мы идем с простой интеграцией iframe.

Пользователь собирается зарегистрироваться на веб-сайте колледжа, и они передадут мне информацию о пользователе, чтобы я мог начать сеанс и дать доступ к страницам курса на моем веб-сайте, которые через iframe они покажут на своих.

Мой сайт построен на LAMP, и я использую Zend framework

Это скелет структуры того, как я планирую сделать

1) на сайте колледжа, как часть кода iframe-они вызовут один из моих классов действий и передадут пользователю электронную почту

<iframe src="http://mywebsite/user/validate/email/alice@gcc.com"></iframe>

2) Теперь в пользовательском контроллер - действие проверить - я в принципе проверить, если пользователь не существует - создайте нового пользователя или загрузки существующего пользователя со своей электронной почты и начать Зенд авт экземпляре и записи пользователей к хранению и перенаправить на его поле страницы, как показано ниже

$currentUser = $userModel->loadUserProfileByEmail($this->_getParam('email'));
$auth = Zend_Auth::getInstance();
$storage = $auth->getStorage();         
$storage->write($currentUser);
return $this->_redirect('/user/my-courses/');

Вот что у меня так далеко - и, очевидно, это работает

Мои Вопросы

1) является ли это лучшим способом сделать это. У меня нет пароля пользователя, потому что аутентификация происходит на сайте колледжа, и они не хотят, чтобы пользователь непосредственно входил на мой сайт.

2) это большой вопрос. Я немного запутался в том, как лучше всего удостовериться, что этот звонок был сделан именно этим колледжем. Как мне это сделать - они передают зашифрованный токен вместе с этим вызовом iframe - и только я есть ключ, чтобы расшифровать его - я не делал этого - я не знаю, если я слишком усложняю что-то простое.

Любые советы и предложения будут оценены Спасибо

2 3

2 ответа:

Возможно, я неправильно понял ваш вопрос, но из того, что я понял, вам нужно:

- способ аутентификации пользователя

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

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

Соберите ваши данные вместе (адрес электронной почты, страница для посадки), а затем хэшируйте их с помощьюсильного ключа .

Расшифровать на другом конце и вуаля-готово.

Этот метод безопасен, если ваш пароль (ключ) трудно угадать - ниже приведен один из способов, который трудно взломать.

Аутентификация

Есть несколько способов сделать это - если у вас есть доступ к их серверу (или кто-то там, кто может вставить какой-то код для вас), то следующее будет работать.

Создайте php-скрипт, который выполняет следующие действия.

Я МАССОВО ПЕРЕПРОЕКТИРОВАЛ ЭТО, ЧТОБЫ ПРОДЕМОНСТРИРОВАТЬ МНОЖЕСТВО СПОСОБОВ СОЗДАНИЯ ХЕШИРОВАННУЮ СТРУНУ ТРУДНЕЕ ВЗЛОМАТЬ - ВЫ МОЖЕТЕ ВЫБРАТЬ СВОЙ СОБСТВЕННЫЙ ПУТЬ!

(псевдокод)

$serverTimeStamp = timestamp;

$additionalNoise = "THEcat1sch33sy";

$time = $serverTimeStamp . "XAB"; <- needs to be a random code as delimeter.
$data =  $additionalNoise + "email@email.com";
$salt = "wh4tW0u1dB4tm4nD0?" + $serverTimeStamp;

$password тогда нуждается в хешировании с обратимым хэшем (mcrypt - хорошее место для начала)

$encrypted = mcrypt of $data and $salt ($salt is shared key);

$authenticationcode = $time . $encrypted;
Это даст вам чертовски сильную случайную строку с отметкой времени спереди, за которой следует XAB, а затем случайная хэшированная строка.

Это будет передано вашему скрипту проверки пользователя.

<iframe src="http://yoursite/validate/COMPLETELYRANDOMSTRING"></iframe>

Оттуда вы обращаете вспять процесс.

IMPORTANT (ammendment) - я совершенно забыл один важный элемент-хранить случайную строку, которая отправляется вам в базе данных. Эти строки являются "одноразовыми" - если вы получаете ту же строку снова, это атака.

Это все облегчается тем, что временная метка находится в соли и в начале строки-можно отправлять одни и те же данные 1000 раз в день с совершенно другой строкой.
Get random string.

get time-stamp from front of random string -> using regex / index of looking for numbers and then XAB (hence the random XAB string - it is just a separator)

$timeStamp = "10200192XAB";

"wh4tW0u1dB4tm4nD0?" <-shared secret key.

$salt (secret key) = "wh4tW0u1dB4tm4nD0?" + $timeStamp;

Расшифровать с помощью соли

Вы получаете свои данные предшествует

"THEcat1sch33sy" (your additional noise) (which is also a fixed shared key in effect)

Просто удалите "THEcat1sch33sy", и у вас будет ваш адрес электронной почты (который вы затем проверяете в 1 из миллиона шансов, что случайная строка на самом деле выплевывает" THEcat1sch33sy " в начале.

Вуаля-не 100% , но поверьте мне-если я пытаюсь проникнуть на ваш сервер - я не буду пытаться таким образом!

ПЕРЕДАЙТЕ СТРАНИЦУ

Simply add it to the $data - so you would pass $email + "seperator" + $coursepage.

Надеюсь, это поможет (и понятно)

Резюме моих рекомендаций

  • посмотрите, есть ли у них решениеФедеративной идентификации и единого входа (FSSO) . Если они это делают, используйте то, что у них есть.
  • Если нет, предложите им получитьFSSO (я рекомендуюShibboleth ) и используйте это.
  • , если они не хотят, свернуть свой собственный с помощью моделирования на Facebook к Facebook приложения обмена.

Подробности
В FSSO есть "поставщик удостоверений личности" (IP) и " поставщик услуг" (ИНТЕЛЛЕКТУАЛЬНАЯ СОБСТВЕННОСТЬ). Колледж-это поставщик удостоверений личности, а вы-поставщик услуг. Поставщиков услуг может быть много. Просто помните, что IP=колледж, SP=вы. Ключевые моменты ФССО:

  1. пользователи аутентифицируются по IP, а не по SP.
  2. Когда IP сигнализирует, что сеанс аутентифицирован, SP доверяет ему.
  3. SP получает аутентифицированные сигналы сеансатолько , когда пользователь аутентифицируется на IP.

Согласно EDUCAUSE , большинство колледжей имеют в ФГНУ. Таким образом, мое первое предложение-пройти миссию по установлению фактов, чтобы проверить, что есть в колледже. Ваш контент будет безопаснее, ваш код проще, и вы будете лучше спать по ночам, если у них уже есть FSSO. К счастью, мой опыт показывает, что в колледжах часто есть вещи, но знание этих вещей не обязательно передается по радио-вам нужно немного копнуть.

Если у них нет FSSO, мое следующее предложение-предложить им установить его. Обучите себя на опции , имея в виду, что единый вход не подразумевает Федеративный идентификатор-и вы хотите оба.

Лично я рекомендуюшибболет . Этос открытым исходным кодом . Я использовал его с лампой и ZF1. Я знаю, что это работает. С помощью Shibboleth колледж настроит IP-адрес Shibboleth, Вы настроите свой SP , вместе вы будете участвовать в потоке данных identity , и как только пользователь войдет в систему, вы получите переменные среды на каждом соединении, сигнализирующем аутентификация типа этой:

array (
    // ...
    [Shib-Application-ID] => my_course_catalog
    [Shib-Session-ID] => _6c45a07c8bc73190242212124221b7
    [Shib-Identity-Provider] => https://shib.college.edu/idp/shibboleth
    [Shib-Authentication-Instant] => 2013-12-31T22:42:07.101Z
    [Shib-AuthnContext-Decl] => urn:oasis:names:tc:SAML:2.0:ac:classes:PasswordProtectedTransport
    [affiliation] => member@college.edu;staff@college.edu
    [eppn] => XXXXXX@college.edu
    [unscoped-affiliation] => member;staff
    // ...
    [REMOTE_USER] => XXXXXX@college.edu
    // ...
)

Способ, которым я реализовал это в ZF1, был плагином контроллера для поиска Shib-Session-ID. Если он будет найден, изготовьте ресурс Шибболета и заполните его Shib-Session-ID и REMOTE_USER, которые я позже смогу опросить для всего, что мне нужно. Если не нашли, перенаправление на страницу входа. (Поскольку вы находитесь в IFRAME, Не делайте этого : вместо этого перенаправьте на действие"нет содержимого для отображения"/" содержимое по умолчанию".)

Что делать, если они не примут предложение установка ФССО? Затем вы должны свернуть свой собственный, и камнем преткновения для вас будет, как вы заметили, доверие.

Проблема с тем, что они посылают вам токен (ваш вопрос № 2), заключается в том, что токен может быть перехвачен (с разной степенью легкости) и воспроизведен против вас. Вы не можете доверять тому, что вам дано. Вы должны взять то, что вам дано, и попросить источник , которому Вы доверяете, проверить то, что дано.

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

Нет простого способа сделать это безопасно. Вот почему были изобретены ФССО, так что все, что тяжелый подъем может быть сделано один раз в доказуемо безопасной манере. Если у вас все еще есть свой собственный ролл, лучшая модель, которую я могу предложить, - это приложение Facebook. Та, где приложение, запущенное на стороннем сервере, "видит" вошедшего в систему пользователя Facebook. Для начала, вотучебник Facebook по аутентификации приложений .

(в настоящее время аутентификация приложения выполняется с помощью iframe POST с идентификатором сеанса входа, который вы проверяете с помощью Facebook... но я понимаю, что браузеры больше не позволяют этого, и вы должны обойти это. Я не знаю наверняка, что-то, что нужно иметь в виду.)

В конечном счете, ФССО является активом для колледжа и благом для вас. Идите с этим, если это вообще возможно. В противном случае, государство-оф-искусство для iframe стороннего приложения с помощью проверки подлинности с Facebook-в Facebook приложения обмена, поэтому модель, которая. Удачи вам!