diff --git a/app/AppKernel.php b/app/AppKernel.php
index c5c9eb6..f97ca6b 100644
--- a/app/AppKernel.php
+++ b/app/AppKernel.php
@@ -16,6 +16,7 @@ class AppKernel extends Kernel
             new Symfony\Bundle\AsseticBundle\AsseticBundle(),
             new Doctrine\Bundle\DoctrineBundle\DoctrineBundle(),
             new Sensio\Bundle\FrameworkExtraBundle\SensioFrameworkExtraBundle(),
+            new HWI\Bundle\OAuthBundle\HWIOAuthBundle(),
         );
 
         if (in_array($this->getEnvironment(), array('dev', 'test'))) {
diff --git a/app/config/config.yml b/app/config/config.yml
index 5490b59..96999bd 100644
--- a/app/config/config.yml
+++ b/app/config/config.yml
@@ -64,3 +64,34 @@ swiftmailer:
     username:  %mailer_user%
     password:  %mailer_password%
     spool:     { type: memory }
+
+# настройки чтобы работал oAuth-бандл HWIOAuthBundle
+hwi_oauth:
+    # name of the firewall in which this bundle is active, this setting MUST be set
+    firewall_name: main
+
+    # an optional setting to configure a query string parameter which can be used to redirect
+    # the user after authentication, e.g. /connect/facebook?_destination=/my/destination will
+    # redirect the user to /my/destination after facebook authenticates them.  If this is not
+    # set then the user will be redirected to the original resource that they requested, or
+    # the base address if no resource was requested.  This is similar to the behaviour of
+    # [target_path_parameter for form login](http://symfony.com/doc/2.0/cookbook/security/form_login.html).
+    # target_path_parameter: _destination
+
+    # here you will add one (or more) configurations for resource owners
+    # and other settings you want to adjust in this bundle, just checkout the list below!
+    # пример пхп-реализации Microsoft Live OAuth: http://wcoders.com/lessons/PHP/137
+    resource_owners:
+#       владелец ресурса (название, придумал сам)
+        owner_windows_live:
+#           тип ресурса ( подробнее http://msdn.microsoft.com/ru-ru/library/live/hh243647.aspx )
+            type:                windows_live
+#           ИД клиента ( ИД приложения )
+            client_id:           0000000045704B0E
+#           Секрет клиента (версия 1)
+            client_secret:       lofQ9aZXCZXCZXCZXC18gk-0dDAXp
+#           Вид информации о пользователе, запрашиваемой у сервиса windows_live (мультиварианты: wl.basic+wl.emails+wl.birthday+wl.signin)
+#           Другими словами это набор прав доступа. Отметьте действия, которые будут доступны приложению после получения токена.
+            scope:               wl.signin
+#            response_type - процедура авторизации, по умолчанию: code
+#            response_type:       token
\ No newline at end of file
diff --git a/app/config/routing_dev.yml b/app/config/routing_dev.yml
index c45f361..c760c60 100644
--- a/app/config/routing_dev.yml
+++ b/app/config/routing_dev.yml
@@ -10,9 +10,28 @@ _configurator:
     resource: "@SensioDistributionBundle/Resources/config/routing/webconfigurator.xml"
     prefix:   /_configurator
 
+# основные роуты
 _main:
     resource: routing.yml
 
+# по хорошему ниже уже ничего быть не может
+
 # AcmeDemoBundle routes (to be removed)
 _acme_demo:
     resource: "@AcmeDemoBundle/Resources/config/routing.yml"
+
+# роуты чтобы работал oAuth-бандл HWIOAuthBundle
+
+hwi_oauth_login:
+    resource: "@HWIOAuthBundle/Resources/config/routing/login.xml"
+    prefix:   /login
+
+hwi_oauth_redirect:
+    resource: "@HWIOAuthBundle/Resources/config/routing/redirect.xml"
+    prefix:   /connect
+
+windows_live_login:
+    pattern: /login/check-windows_live
+
+logout:
+    path:   /logout
\ No newline at end of file
diff --git a/app/config/security.yml b/app/config/security.yml
index 243aa71..7a048e8 100644
--- a/app/config/security.yml
+++ b/app/config/security.yml
@@ -7,11 +7,18 @@ security:
         ROLE_SUPER_ADMIN: [ROLE_USER, ROLE_ADMIN, ROLE_ALLOWED_TO_SWITCH]
 
     providers:
+        chain_provider:
+            chain:
+                providers: [in_memory, user_db]
         in_memory:
             memory:
                 users:
                     user:  { password: userpass, roles: [ 'ROLE_USER' ] }
                     admin: { password: adminpass, roles: [ 'ROLE_ADMIN' ] }
+#	    user_db - просто название провайдера (кроме как здесь, более нигде название не светится)
+        user_db:
+#           ИД провайдера (прописано в /src/Acme/DemoBundle/Resources/config/services.xml
+            id: ib_user.oauth_user_provider
 
     firewalls:
         dev:
@@ -33,7 +40,42 @@ security:
             #anonymous: ~
             #http_basic:
             #    realm: "Secured Demo Area"
+#       main - просто название фаервола (я его сам выдумал)
+        main:
+#           ВНИМАНИЕ: т.к. в этом фаерволе НЕ указано security: false - значит проверкой доступа займется
+#           выше описанный security: encoders: Symfony\Component\Security\Core\User\User: plaintext
+
+            pattern: ^/
+#           расскомментируем, чтобы начал работать oAuth-бандл HWIOAuthBundle
+            anonymous: true
+            logout: true
+            logout:
+                path:   /logout
+                target: /
+#           укажем название ресурса авторизации, чтобы начал работать oAuth-бандл HWIOAuthBundle
+            oauth:
+#                укажим владельцев ресурса
+                 resource_owners:
+#                     owner_windows_live - название владельца указанное в /app/config/config.yml
+#                     значение данного владельца - урл по которому будут обращаться пользователи
+                      owner_windows_live: "/login/check-windows_live"
+#                урл, где лежит форма авторизации ( если пользователь не авторизован - отправляем его на страницу с именем роутинга _demo_login - /demo/secured/login )
+                 login_path: /login
+#                наверное: урл страницы, куда попадает пользователь, если не авторизовался (ввел неправильно данные или еще что-либо)
+                 failure_path: /login
+#                oAuth-бандлу HWIOAuthBundle нужен сервис, который позволяет загружать пользователей, основываясь на oauth-действиях пользователя
+#                конечной точки. Если бы у нас была своя пользовательская служба, то она должена была бы реализовать интерфейс:
+#                HWI\Bundle\OAuthBundle\Security\Core\User\OAuthAwareUserProviderInterface.
+                 oauth_user_provider:
+#                     HWIOAuthBundle поставляется с тремя реализациями по умолчанию:
+#                     OAuthUserProvider (сервисное название: hwi_oauth.user.provider) - данные не сохраняют пользователей
+#                     EntityUserProvider (сервисное название: hwi_oauth.user.provider.entity) - загружает пользователей из базы данных
+#                     FOSUserBundle интеграция (сервисное название: hwi_oauth.user.provider.fosub_bridge).
+                      service: ib_user.oauth_user_provider
 
     access_control:
         - { path: ^/demo/secured/hello/admin/, roles: ROLE_ADMIN }
         #- { path: ^/login, roles: IS_AUTHENTICATED_ANONYMOUSLY, requires_channel: https }
+        - { path: ^/login, role: IS_AUTHENTICATED_ANONYMOUSLY }
+        - { path: ^/connect, role: IS_AUTHENTICATED_ANONYMOUSLY }
+        - { path: ^/, role: ROLE_USER }
diff --git a/src/Acme/DemoBundle/Entity/User.php b/src/Acme/DemoBundle/Entity/User.php
index 70caba8..ca8656d 100644
--- a/src/Acme/DemoBundle/Entity/User.php
+++ b/src/Acme/DemoBundle/Entity/User.php
@@ -1,8 +1,206 @@
 <?php
 /**
- * Created by JetBrains PhpStorm.
- * User: lebnik
- * Date: 10/30/13
- * Time: 12:27 PM
- * To change this template use File | Settings | File Templates.
- */
\ No newline at end of file
+ * сущность пользователя с признаками OAuthUser
+ */
+namespace Acme\DemoBundle\Entity;
+
+use Doctrine\ORM\Mapping as ORM;
+use Symfony\Component\Security\Core\User\UserInterface;
+use Symfony\Component\Security\Core\User\EquatableInterface;
+/**
+ * @ORM\Entity(repositoryClass="Acme\DemoBundle\Repository\UserRepository")
+ * @ORM\Table(name="users", uniqueConstraints={@ORM\UniqueConstraint(name="email",columns={"email"})})
+ */
+class User implements UserInterface, EquatableInterface
+{
+    /**
+     * @ORM\Id
+     * @ORM\Column(type="integer")
+     * @ORM\GeneratedValue(strategy="AUTO")
+     */
+    private $id = 0;
+
+    /**
+     * @ORM\Column(type="string", length=255, options={"default":""})
+     */
+    private $email = '';
+
+    /**
+     * @ORM\Column(type="integer", options={"default":0})
+     */
+    private $time_created = 0;
+
+    /**
+     * @ORM\Column(type="string", length=255, options={"default":""})
+     */
+    private $name = '';
+
+    /**
+     * @ORM\Column(type="string", length=16, options={"default":""})
+     */
+    private $windows_live = '';
+
+    /**
+     * Get id
+     *
+     * @return integer
+     */
+    public function getId()
+    {
+        return $this->id;
+    }
+
+    /**
+     * Set email
+     *
+     * @param string $email
+     * @return User
+     */
+    public function setEmail($email)
+    {
+        $this->email = $email;
+
+        return $this;
+    }
+
+    /**
+     * Get email
+     *
+     * @return string
+     */
+    public function getEmail()
+    {
+        return $this->email;
+    }
+
+    /**
+     * Set time_created
+     *
+     * @param integer $timeCreated
+     * @return User
+     */
+    public function setTimeCreated($timeCreated)
+    {
+        $this->time_created = $timeCreated;
+
+        return $this;
+    }
+
+    /**
+     * Get time_created
+     *
+     * @return integer
+     */
+    public function getTimeCreated()
+    {
+        return $this->time_created;
+    }
+
+    /**
+     * Set name
+     *
+     * @param string $name
+     * @return User
+     */
+    public function setName($name)
+    {
+        $this->name = $name;
+
+        return $this;
+    }
+
+    /**
+     * Get name
+     *
+     * @return string
+     */
+    public function getName()
+    {
+        return $this->name;
+    }
+
+    /**
+     * Set windows_live
+     *
+     * @param string $windowsLive
+     * @return User
+     */
+    public function setWindowsLive($windowsLive)
+    {
+        $this->windows_live = $windowsLive;
+
+        return $this;
+    }
+
+    /**
+     * Get windows_live
+     *
+     * @return string
+     */
+    public function getWindowsLive()
+    {
+        return $this->windows_live;
+    }
+
+    /**
+     * {@inheritDoc}
+     */
+    public function getUsername()
+    {
+        return $this->windows_live;
+    }
+
+    /**
+     * {@inheritDoc}
+     */
+    public function getRoles()
+    {
+        return array('ROLE_USER', 'ROLE_OAUTH_USER');
+    }
+
+    private $password;
+
+    public function setPassword($password = '')
+    {
+        $this->password = $password;
+    }
+
+    public function getPassword()
+    {
+        return $this->password;
+    }
+
+    /**
+     * {@inheritDoc}
+     */
+    public function getSalt()
+    {
+        return '';
+    }
+
+    /**
+     * {@inheritDoc}
+     */
+    public function eraseCredentials()
+    {
+    }
+
+    /**
+     * объявлен т.к. этого требует EquatableInterface
+     * проверка пользователя (на момент тестирования данная функция не вызывалась, т.е. смысла ее использовать нет)
+     * @param UserInterface $user
+     * @return bool
+     */
+    public function isEqualTo(UserInterface $user)
+    {
+        /*
+        if (!$user instanceof User) {
+            return false;
+        }
+        if ((int)$this->getId() === $user->getId()) {
+            return true;
+        }
+        return true;
+        */
+    }
+}
\ No newline at end of file
diff --git a/src/Acme/DemoBundle/Repository/UserRepository.php b/src/Acme/DemoBundle/Repository/UserRepository.php
index 8f3259f..5f57d26 100644
--- a/src/Acme/DemoBundle/Repository/UserRepository.php
+++ b/src/Acme/DemoBundle/Repository/UserRepository.php
@@ -1,8 +1,13 @@
 <?php
 /**
- * Created by JetBrains PhpStorm.
- * User: lebnik
- * Date: 10/30/13
- * Time: 7:13 PM
- * To change this template use File | Settings | File Templates.
- */
\ No newline at end of file
+ * Класс для редактирования пользователя
+ */
+namespace Acme\DemoBundle\Repository;
+
+use Acme\DemoBundle\Entity\User;
+
+use Doctrine\ORM\EntityRepository;
+
+class UserRepository extends EntityRepository
+{
+}
\ No newline at end of file
diff --git a/src/Acme/DemoBundle/Resources/config/services.xml b/src/Acme/DemoBundle/Resources/config/services.xml
index d6274ce..e41ccd3 100644
--- a/src/Acme/DemoBundle/Resources/config/services.xml
+++ b/src/Acme/DemoBundle/Resources/config/services.xml
@@ -3,8 +3,13 @@
 <container xmlns="http://symfony.com/schema/dic/services"
     xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
     xsi:schemaLocation="http://symfony.com/schema/dic/services http://symfony.com/schema/dic/services/services-1.0.xsd">
-
+    <parameters>
+        <parameter key="ib_user.oauth_user_provider.class">Acme\DemoBundle\Security\Provider</parameter>
+    </parameters>
     <services>
+        <service id="ib_user.oauth_user_provider" class="%ib_user.oauth_user_provider.class%">
+            <argument type="service" id="doctrine" />
+        </service>
         <service id="twig.extension.acme.demo" class="Acme\DemoBundle\Twig\Extension\DemoExtension" public="false">
             <tag name="twig.extension" />
             <argument type="service" id="twig.loader" />
diff --git a/src/Acme/DemoBundle/Security/Provider.php b/src/Acme/DemoBundle/Security/Provider.php
index 3040137..82adeeb 100644
--- a/src/Acme/DemoBundle/Security/Provider.php
+++ b/src/Acme/DemoBundle/Security/Provider.php
@@ -1,8 +1,123 @@
 <?php
 /**
- * Created by JetBrains PhpStorm.
- * User: lebnik
- * Date: 10/30/13
- * Time: 12:26 PM
- * To change this template use File | Settings | File Templates.
- */
\ No newline at end of file
+ * Провайдер аутентификации (не Авторизации) - возвращает менеджеру ( Symfony AuthenticationManager ), а тот, в свою
+ * очередь listener’y авторизованный (или не авторизванный) token. На данном этапе задействуется UserProvider, который
+ * и работает с данными о пользователе.
+ */
+namespace Acme\DemoBundle\Security;
+
+use Symfony\Component\Security\Core\User\UserInterface;
+use HWI\Bundle\OAuthBundle\OAuth\Response\UserResponseInterface;
+use HWI\Bundle\OAuthBundle\Security\Core\User\OAuthUserProvider;
+use Symfony\Component\Security\Core\Exception\UsernameNotFoundException;
+use Symfony\Component\Security\Core\Exception\UnsupportedUserException;
+use Acme\DemoBundle\Entity\User;
+
+class Provider extends OAuthUserProvider
+{
+
+    private $doctrine;
+
+    public function __construct($doctrine)
+    {
+        $this->doctrine = $doctrine;
+    }
+
+    /**
+     * находит и возвращает экземпляр класса User или пустой массив (а по версии Symfony должен возвращать false).
+     * @param string $username - ID пользователя
+     * @return User|\Symfony\Component\Security\Core\User\UserInterface
+     * @throws \Symfony\Component\Security\Core\Exception\UsernameNotFoundException
+     */
+    public function loadUserByUsername($username)
+    {
+        if( empty($username) ){
+            return ;
+        }
+        // получаем данные о пользователе
+        /** @var $user \Acme\DemoBundle\Entity\User */
+        $user = $this->getUserByWindowsLive($username);
+
+        if ( $user && $user->getId() ) {
+            return $user;
+        }
+
+        throw new UsernameNotFoundException(sprintf('Username "%s" does not exist.', $username));
+    }
+
+    /**
+     * Предположительно: метод вызывается, когда процесс Аутентификации (не Авторизации) успешно выполнен
+     * проверяет сущестование пользователя в Б.Д., заводит сессию и возвращает данные пользователя по $username
+     * @param UserResponseInterface $response
+     * @return User|\Symfony\Component\Security\Core\User\UserInterface
+     * @throws \Symfony\Component\Security\Core\Exception\UsernameNotFoundException
+     */
+    public function loadUserByOAuthUserResponse(UserResponseInterface $response)
+    {
+
+        $email = $response->getEmail();// емэйл пользователя, например:totx@narod.ru
+        $name = $response->getRealName();// имя пользователя на стороне oAuth-сервера, например:Nikolay Lebedenko
+        $username = $response->getUsername();// уникальный ID пользователя на стороне oAuth-сервера, например:8d86a051742940e3
+        $response->getAccessToken();// токен (уникальный идентификатор) для авторизации, например:ZxC1/2+3 (более 255 символов)
+        $response->getExpiresIn();// предположительно: через какое время токен становится недействительным, например:3600 (секунд)
+        $response->getProfilePicture();// изображение профиля, может не быть, например:пусто
+        $response->getRefreshToken();// например:пусто
+        $response->getTokenSecret();// например:пусто
+
+        if( empty($email) ){
+
+            throw new UsernameNotFoundException('Вы не идентифицированы т.к. не получен Email-адрес');
+
+        }
+
+        $user = $this->getUserByWindowsLive($username);// находим пользователя
+        /** @var $user \Acme\DemoBundle\Entity\User */
+
+        // если пользователя нет в базе данных - добавим его
+        if( !$user || !$user->getId() ){
+
+            $user = new User();
+            $user->setName($name);
+            $user->setEmail($email);
+            $user->setWindowsLive($username);
+
+            $this->doctrine->getManager()->persist($user);
+            $this->doctrine->getManager()->flush();
+
+            $user_id = $user->getId();
+        }else{
+            $user_id = $user->getId();
+        }
+
+        if( !$user_id ){
+            throw new UsernameNotFoundException('Возникла проблема добавления или определения пользователя');
+        }
+
+        return $this->loadUserByUsername($username);
+
+    }
+
+    public function refreshUser(UserInterface $user)
+    {
+        if (!$user instanceof User) {
+            throw new UnsupportedUserException(sprintf('Instances of "%s" are not supported.', get_class($user)));
+        }
+        return $this->loadUserByUsername($user->getUsername());
+    }
+
+    /**
+     * Метод проверки класса пользователя
+     * предположение: нужен чтобы Symfony использовал правильный класс Пользователя для получения объекта пользователя
+     * @param string $class
+     * @return bool
+     */
+    public function supportsClass($class)
+    {
+        return $class === 'Acme\\DemoBundle\\Entity\\User';
+    }
+
+    private function getUserByWindowsLive($username = '')
+    {
+        return $user = $this->doctrine->getRepository('AcmeDemoBundle:User')->findOneBy(array('windows_live' => $username));
+    }
+}
\ No newline at end of file
diff --git a/web/app.php b/web/app.php
index b70e120..889793b 100644
--- a/web/app.php
+++ b/web/app.php
@@ -2,7 +2,7 @@
 
 use Symfony\Component\ClassLoader\ApcClassLoader;
 use Symfony\Component\HttpFoundation\Request;
-
+umask(0000);
 $loader = require_once __DIR__.'/../app/bootstrap.php.cache';
 
 // Use APC for autoloading to improve performance.
diff --git a/web/app_dev.php b/web/app_dev.php
index 872a882..b2060f4 100644
--- a/web/app_dev.php
+++ b/web/app_dev.php
@@ -5,10 +5,11 @@ use Symfony\Component\Debug\Debug;
 
 // If you don't want to setup permissions the proper way, just uncomment the following PHP line
 // read http://symfony.com/doc/current/book/installation.html#configuration-and-setup for more information
-//umask(0000);
+umask(0000);
 
 // This check prevents access to debug front controllers that are deployed by accident to production servers.
 // Feel free to remove this, extend it, or make something more sophisticated.
+/*
 if (isset($_SERVER['HTTP_CLIENT_IP'])
     || isset($_SERVER['HTTP_X_FORWARDED_FOR'])
     || !in_array(@$_SERVER['REMOTE_ADDR'], array('127.0.0.1', 'fe80::1', '::1'))
@@ -16,7 +17,7 @@ if (isset($_SERVER['HTTP_CLIENT_IP'])
     header('HTTP/1.0 403 Forbidden');
     exit('You are not allowed to access this file. Check '.basename(__FILE__).' for more information.');
 }
-
+*/
 $loader = require_once __DIR__.'/../app/bootstrap.php.cache';
 Debug::enable();
 
diff --git a/web/config.php b/web/config.php
index 162acfc..3a9e050 100644
--- a/web/config.php
+++ b/web/config.php
@@ -3,7 +3,7 @@
 if (!isset($_SERVER['HTTP_HOST'])) {
     exit('This script cannot be run from the CLI. Run it from a browser.');
 }
-
+/*
 if (!in_array(@$_SERVER['REMOTE_ADDR'], array(
     '127.0.0.1',
     '::1',
@@ -11,7 +11,7 @@ if (!in_array(@$_SERVER['REMOTE_ADDR'], array(
     header('HTTP/1.0 403 Forbidden');
     exit('This script is only accessible from localhost.');
 }
-
+*/
 require_once dirname(__FILE__).'/../app/SymfonyRequirements.php';
 
 $symfonyRequirements = new SymfonyRequirements();
