Аутентификация пользователя в торнадо на основе другого php сайта - PullRequest
0 голосов
/ 28 июня 2011

Я написал свой собственный длинный опрос Tornado / AJAX с комнатами, шепотными сообщениями и другими интересными вещами. До сих пор в качестве аутентификации пользователя только для целей тестирования я использовал куки. Таким образом, вам нужно было просто ввести свое имя, после чего пользователь cokie был создан, и чат реагировал бы соответственно на этот cookie. Но проблема в том, что я написал этот чат для друга, у которого есть сайт php. В общем, мне нужно аутентифицировать пользователей на основе его сессий. Вот где я запутался. И мне очень стыдно , потому что я поймал себя на мысли, что не знаю, как именно работает сессия, что абсурдно, потому что я не считаю себя таким плохим программистом ^^ Хорошо дерьмо случается. Конечно, я знаю, что сеансы хранят только идентификатор клиента, а другая информация хранится на сервере, но это не очень помогает, потому что мне нужно точно знать, что происходит в деталях. Конечно, я немного погуглил, но все еще не понимаю, как решить эту проблему. Итак, основные вопросы:

1) Буду признателен, если кто-нибудь сможет подробно объяснить еще раз, как именно сеансы работают, и что мне нужно знать или иметь доступ на сайте php, чтобы использовать сеансы в другом приложении ...

* 2) * Так, например, когда я аутентифицируюсь на своем сайте django, сессия создается с некоторым значением, например, 's5ds6dssd6', и, честно говоря, я не знаю, что делать дальше с Стыдно снова. Например, в PHP для извлечения имени пользователя (если оно было установлено) и проверки / выполнения чего-либо, я бы сделал что-то вроде PHP_SESSION ['username'] === .... В django еще меньше работы, просто чтобы использовать декоратор или метод user.is_authenticated , Но как это работает внутри и что мне нужно, я не знаю.


Есть большая вероятность, что я написал глупо, и это очень легко, и я идиот, который писал до того, как попробовал ... И все же, даже если бы я каким-то образом смог бы получить данные с сайта session / php, как мог я уверен, что какой-то парень сам не создал сессию со случайным идентификатором, не авторизовавшись на php сайте ....

Хорошо, надеюсь, кто-нибудь может указать мне правильное направление. Было необходимо написать так много, чтобы вы могли удивиться =) что беспокоит меня и ответить соответственно .... Извините, если я написал что-то глупое.

1 Ответ

2 голосов
/ 28 июня 2011

1) Буду признателен, если кто-то может подробнее объясните еще раз как именно работают сессии, и что я нужно знать или иметь доступ к на php сайт, чтобы использовать сеансы в другом приложение ...

PS: я использую Linux (я использую свободно доступную Ubuntu , которая является самым популярным / удобным для Linux дистрибутивом ) в качестве OS ниже, и я бы посоветовал вам использовать * nx дистрибутив (MacOSX также неплох, но, на мой взгляд, дорогой), а также все ваши веб-разработки, хотя все эти команды также доступны в Cygwin ( окна) .

Сессии :

Поддержка сессий в PHP состоит из способ сохранить определенные данные через последующие доступы. Это позволяет вам создавать более индивидуальные приложения и повысить привлекательность вашей сети сайт.

Ниже я попытаюсь объяснить, что такое сеансы и как они используют куки


Я создал простой no.php, который не использует сессии и просто выводит Hello World:

Hello World

Когда мы curl этот сценарий с заголовками , используя -v , мы получаем следующий вывод:

alfred@alfred-laptop:~/www/6500588$ curl http://localhost/6500588/no.php -v
* About to connect() to localhost port 80 (#0)
*   Trying ::1... Connection refused
*   Trying 127.0.0.1... connected
* Connected to localhost (127.0.0.1) port 80 (#0)
> GET /6500588/no.php HTTP/1.1
> User-Agent: curl/7.21.0 (i686-pc-linux-gnu) libcurl/7.21.0 OpenSSL/0.9.8o zlib/1.2.3.4 libidn/1.18
> Host: localhost
> Accept: */*
> 
< HTTP/1.1 200 OK
< Date: Tue, 28 Jun 2011 02:10:53 GMT
< Server: Apache/2.2.16 (Ubuntu)
< X-Powered-By: PHP/5.3.3-1ubuntu9.3
< Vary: Accept-Encoding
< Content-Length: 12
< Content-Type: text/html
< 
Hello World
* Connection #0 to host localhost left intact
* Closing connection #0

Как видно из вывода, cookie не установлено. Если вы сделаете это несколько раз, вы получите тот же результат.


Далее я создаю простой yes.php файл, который использует сессии.

<?php

session_start();

if (!isset($_SESSION['count'])) {
    $_SESSION['count'] = 0;
}

echo $_SESSION['count']++;

Давайте покажем вывод из curl без сохранения cookie:

alfred@alfred-laptop:~/www/6500588$ curl http://localhost/6500588/yes.php -v
* About to connect() to localhost port 80 (#0)
*   Trying ::1... Connection refused
*   Trying 127.0.0.1... connected
* Connected to localhost (127.0.0.1) port 80 (#0)
> GET /6500588/yes.php HTTP/1.1
> User-Agent: curl/7.21.0 (i686-pc-linux-gnu) libcurl/7.21.0 OpenSSL/0.9.8o zlib/1.2.3.4 libidn/1.18
> Host: localhost
> Accept: */*
> 
< HTTP/1.1 200 OK
< Date: Tue, 28 Jun 2011 02:12:47 GMT
< Server: Apache/2.2.16 (Ubuntu)
< X-Powered-By: PHP/5.3.3-1ubuntu9.3
< Set-Cookie: PHPSESSID=hrduhht116e9mikhkkj0gu7126; path=/
< Expires: Thu, 19 Nov 1981 08:52:00 GMT
< Cache-Control: no-store, no-cache, must-revalidate, post-check=0, pre-check=0
< Pragma: no-cache
< Vary: Accept-Encoding
< Content-Length: 1
< Content-Type: text/html
< 
* Connection #0 to host localhost left intact
* Closing connection #0
0

Как видите, счетчик равен 0, но также был установлен cookie: Set-Cookie: PHPSESSID=hrduhht116e9mikhkkj0gu7126; path=/. с идентификатор_сессии hrduhht116e9mikhkkj0gu7126


Если мы не сохраним этот файл cookie, когда снова введем ту же команду curl, мы все равно получим 0 в качестве ответа (не считая счет), а также получим еще один файл cookie.

alfred@alfred-laptop:~/www/6500588$ curl http://localhost/6500588/yes.php -v
* About to connect() to localhost port 80 (#0)
*   Trying ::1... Connection refused
*   Trying 127.0.0.1... connected
* Connected to localhost (127.0.0.1) port 80 (#0)
> GET /6500588/yes.php HTTP/1.1
> User-Agent: curl/7.21.0 (i686-pc-linux-gnu) libcurl/7.21.0 OpenSSL/0.9.8o zlib/1.2.3.4 libidn/1.18
> Host: localhost
> Accept: */*
> 
< HTTP/1.1 200 OK
< Date: Tue, 28 Jun 2011 02:16:42 GMT
< Server: Apache/2.2.16 (Ubuntu)
< X-Powered-By: PHP/5.3.3-1ubuntu9.3
< Set-Cookie: PHPSESSID=ihlj9c9fifl8f0lklu0umesas2; path=/
< Expires: Thu, 19 Nov 1981 08:52:00 GMT
< Cache-Control: no-store, no-cache, must-revalidate, post-check=0, pre-check=0
< Pragma: no-cache
< Vary: Accept-Encoding
< Content-Length: 1
< Content-Type: text/html
< 
* Connection #0 to host localhost left intact
* Closing connection #0
0

Как видите, hrduhht116e9mikhkkj0gu7126 не равно ihlj9c9fifl8f0lklu0umesas2, что означает, что был установлен новый файл cookie и информация в этом сеансе потеряна.


Затем мы сохраняем файл cookie для cookie файла, выдающего -c flag

alfred@alfred-laptop:~/www/6500588$ curl http://localhost/6500588/yes.php -v -c cookie
* About to connect() to localhost port 80 (#0)
*   Trying ::1... Connection refused
*   Trying 127.0.0.1... connected
* Connected to localhost (127.0.0.1) port 80 (#0)
> GET /6500588/yes.php HTTP/1.1
> User-Agent: curl/7.21.0 (i686-pc-linux-gnu) libcurl/7.21.0 OpenSSL/0.9.8o zlib/1.2.3.4 libidn/1.18
> Host: localhost
> Accept: */*
> 
< HTTP/1.1 200 OK
< Date: Tue, 28 Jun 2011 02:27:11 GMT
< Server: Apache/2.2.16 (Ubuntu)
< X-Powered-By: PHP/5.3.3-1ubuntu9.3
* Added cookie PHPSESSID="1h6710hhk84e0k9bj2kg7p03u5" for domain localhost, path /, expire 0
< Set-Cookie: PHPSESSID=1h6710hhk84e0k9bj2kg7p03u5; path=/
< Expires: Thu, 19 Nov 1981 08:52:00 GMT
< Cache-Control: no-store, no-cache, must-revalidate, post-check=0, pre-check=0
< Pragma: no-cache
< Vary: Accept-Encoding
< Content-Length: 1
< Content-Type: text/html
< 
* Connection #0 to host localhost left intact
* Closing connection #0
0

Как видно из ls (список каталогов), мы сохранили cookie в файл с именем cookie.

alfred@alfred-laptop:~/www/6500588$ ls -al
total 20
drwxr-xr-x  2 alfred alfred 4096 2011-06-28 04:27 .
drwxr-xr-x 19 alfred alfred 4096 2011-06-28 03:59 ..
-rw-r--r--  1 alfred alfred  196 2011-06-28 04:27 cookie
-rw-r--r--  1 alfred alfred   12 2011-06-28 04:00 no.php
-rw-r--r--  1 alfred alfred  114 2011-06-28 04:12 yes.php

Этот файл cookie для отслеживания количества содержит следующую информацию в соответствии с cat (показывает вывод файла)

alfred@alfred-laptop:~/www/6500588$ cat cookie 
# Netscape HTTP Cookie File
# http://curl.haxx.se/rfc/cookie_spec.html
# This file was generated by libcurl! Edit at your own risk.

localhost   FALSE   /   FALSE   0   PHPSESSID   1h6710hhk84e0k9bj2kg7p03u5

Затем мы используем этот файл cookie для отслеживания количества.

alfred@alfred-laptop:~/www/6500588$ curl http://localhost/6500588/yes.php -v -b cookie
* About to connect() to localhost port 80 (#0)
*   Trying ::1... Connection refused
*   Trying 127.0.0.1... connected
* Connected to localhost (127.0.0.1) port 80 (#0)
> GET /6500588/yes.php HTTP/1.1
> User-Agent: curl/7.21.0 (i686-pc-linux-gnu) libcurl/7.21.0 OpenSSL/0.9.8o zlib/1.2.3.4 libidn/1.18
> Host: localhost
> Accept: */*
> Cookie: PHPSESSID=1h6710hhk84e0k9bj2kg7p03u5
> 
< HTTP/1.1 200 OK
< Date: Tue, 28 Jun 2011 02:40:18 GMT
< Server: Apache/2.2.16 (Ubuntu)
< X-Powered-By: PHP/5.3.3-1ubuntu9.3
< Expires: Thu, 19 Nov 1981 08:52:00 GMT
< Cache-Control: no-store, no-cache, must-revalidate, post-check=0, pre-check=0
< Pragma: no-cache
< Vary: Accept-Encoding
< Content-Length: 1
< Content-Type: text/html
< 
* Connection #0 to host localhost left intact
* Closing connection #0
1

Как вы можете видеть, мы использовали этот файл cookie с тем же идентификатором 1h6710hhk84e0k9bj2kg7p03u5, и его число составляет 1 вместо 0, когда мы не используем файлы cookie (или не храним файлы cookie и не получаем новые файлы cookie).


Так что в основном мне нужно аутентифицироваться пользователи на основе его сессий.

сессии просто использовать куки ( sessionid ) под обложкой. Например, вы можете переопределить стандартную реализацию для сеансов , чтобы использовать базу данных вместо файловой системы (интересно читать!). Но я бы просто использовал session_id , который вы получаете от PHP (session_id) в вашем приложении торнадо, для аутентификации вашего сеанса, потому что он должен быть уникальным (трудно угадать).

session_id () возвращает идентификатор сеанса для текущей сессии или пустой строка (""), если тока нет сеанс (без текущего идентификатора сеанса существует).


П.С .: Надеюсь, это немного ответит на ваш вопрос. Если нет, то вы можете попросить в комментариях немного больше информации?

...