0

I use HwioBundle and owner facebook, vk. I need IP user before hwio conect to owner, I try use $ip = $request->getClientIp(); but in class UserProvider I have not request, only respons, calssUserProvider this is service and I do to add service request, this my service :

        <service id="app.provider.user_provider" class="%my_user_provider.class%">
        <argument type="service" id="fos_user.user_manager" />
        <argument type="service" id="request_stack" />
        <argument type="collection">
            <argument key="facebook">facebookId</argument>
            <argument key="vkontakte">vkontakteId</argument>

        </argument>
        <call method="setFacebookProvider">
            <argument type="service" id="geekhub.user.facebook_provider" />
        </call>
        <call method="setVkontakteProvider">
            <argument type="service" id="geekhub.user.vkontakte_provider" />
        </call>
        </service>

I try many variant but I don't know exactly needed, and this is action:

    <?php

     namespace UserBundle\Providers;
     use HWI\Bundle\OAuthBundle\OAuth\Response\UserResponseInterface;
     use HWI\Bundle\OAuthBundle\Security\Core\User\FOSUBUserProvider as BaseClass;
     use Symfony\Component\Security\Core\User\UserInterface;

     class UserProvider extends BaseClass
     {
     private $vkontakteProvider;

     private $facebookProvider;

    public $requestStack;

/**
 * Constructor.
 *
 * @param UserManagerInterface $userManager FOSUB user provider.
 * @param array                $properties  Property mapping.
 */
public function __construct(UserManagerInterface $userManager, $requestStack, array $properties)
{
    $this->requestStack = $requestStack;
    $this->userManager = $userManager;
    $this->properties  = array_merge($this->properties, $properties);
    $this->accessor    = PropertyAccess::createPropertyAccessor();
}

/**
 * {@inheritDoc}
 */
public function connect(UserInterface $user, UserResponseInterface $response)
{
    $property = $this->getProperty($response);
    $username = $response->getUsername();

    //on connect - get the access token and the user ID
    $service = $response->getResourceOwner()->getName();

    $setter = 'set'.ucfirst($service);
    $setter_id = $setter.'Id';
    $setter_token = $setter.'AccessToken';

    //we "disconnect" previously connected users
    if (null !== $previousUser = $this->userManager->findUserBy(array($property => $username))) {
        $previousUser->$setter_id(null);
        $previousUser->$setter_token(null);
        $this->userManager->updateUser($previousUser);
    }

    //we connect current user
    $user->$setter_id($username);
    $user->$setter_token($response->getAccessToken());

    $this->userManager->updateUser($user);
}

/**
 * {@inheritdoc}
 */
public function loadUserByOAuthUserResponse(UserResponseInterface $response)
{
    $ip_reguestStack = $requestStack->getCurrentRequest()->getClientIP()
    $ip = $_SERVER['REMOTE_ADDR'];

    $ip_requestStack = $this->requestStack->getCurrentRequest()->getClientIP();
    dump($ip, $ip_requestStack);exit;
    $username = $response->getUsername();
    $email = $response->getEmail();

    $user = $this->userManager->findUserBy(array($this->getProperty($response) => $username));

    //when the user is registrating
    if (null === $user) {

        $user = $this->userManager->findUserByEmail($email);

        $service = $response->getResourceOwner()->getName();
        $setter = 'set' . ucfirst($service);
        $setterId = $setter . 'Id';
        $setterToken = $setter . 'AccessToken';
        if (null === $user) {
            $user = $this->userManager->createUser();
            $user->$setterId($username);
            $user->$setterToken($response->getAccessToken());

            $serviceProvider = $service."Provider";

            $user = $this->$serviceProvider->setUserData($user, $response);

            $this->userManager->updateUser($user);

            return $user;
        }else {
            $user->$setterId($username);
            $user->$setterToken($response->getAccessToken());

            $serviceProvider = $service."Provider";

            $user = $this->$serviceProvider->setUserData($user, $response);

            $this->userManager->updateUser($user);

            return $user;
        }
    }


    //if user exists - go with the HWIOAuth way
    $user = parent::loadUserByOAuthUserResponse($response);

    $serviceName = $response->getResourceOwner()->getName();
    $setter = 'set' . ucfirst($serviceName) . 'AccessToken';

    //update access token
    $user->$setter($response->getAccessToken());

    return $user;
}

public function setVkontakteProvider(VkontakteProvider $vkontakteProvider)
{
    $this->vkontakteProvider = $vkontakteProvider;
}

public function setFacebookProvider(FacebookProvider $facebookProvider)
{
    $this->facebookProvider = $facebookProvider;
}

}

now I have

UserProvider.php on line 52:
"10.184.59.34"

UserProvider.php on line 52:
"10.229.34.154"

but in http://myip.com.ua/ my IP 109.227.72.9

And Undefinded varible $requestStack

I use Symfony 2.6.11

If dump $ip = $_SERVER['REMOTE_ADDR'] I have another Ip, not my with connect, maybe hosting server in global variable $_SERVER is the value IP ? And when $this->container I have Notice: Undefined property: UserBundle\Providers\UserProvider::$container How I get IP user who want to be registration in my site ?

shuba.ivan
  • 3,824
  • 8
  • 49
  • 121
  • Can you show full UserProvider class? Actually it looks like you trying to get undefined $container property. What version of Symfony you uses? – nowiko Aug 09 '15 at 14:18
  • symfony 2.6 I update my answer – shuba.ivan Aug 09 '15 at 14:19
  • are you sure you define $continer property in provider class? In 2.6 I used $this->container->get('request_stack')->getCurrentRequest()->getClientIp(); and it was works porperly... – nowiko Aug 09 '15 at 14:24
  • 1
    Inject the `@request_stack` (or `` in XML) and do like @excluded_once kind of says and use `$ip = $requestStack->getCurrentRequest()->getClientIP()`. – qooplmao Aug 09 '15 at 16:00
  • I update. Undefinded varible $requestStack – shuba.ivan Aug 09 '15 at 17:29
  • Where is your constructor for initialize $this->requestStack? – nowiko Aug 09 '15 at 17:58
  • I foget, now I initialize and I have 10.229.34.154 but in http://myip.com.ua/ my IP 109.227.72.9 I update question – shuba.ivan Aug 09 '15 at 18:59
  • ok, I have idea.. I dont know it will work or not, but you can try it. Create some action where you will get request and ip from user and then forward to action that will register user through facebook or vkontakte. – nowiko Aug 09 '15 at 19:02
  • but it fire another question, how to store it until we get user credentials from facebook :) – nowiko Aug 09 '15 at 19:12
  • you can store it in some third party service (e.g. some cache driver or database), but it look like crutches :) – nowiko Aug 09 '15 at 19:14
  • I understand, I chose heroku for hosting. Now I try VirtualServer OceanDigital and now $ipr = $_SERVER['REMOTE_ADDR']; and $ip = $this->requestStack->getCurrentRequest()->getClientIP(); I have my ip 109.227.72.9 – shuba.ivan Aug 09 '15 at 19:29
  • and now new question, how in heroku get getClientIP ? :) – shuba.ivan Aug 09 '15 at 19:30
  • em... I am not quite strong in networks, but it looks like heroku use some proxy server and you getting ip of proxy... – nowiko Aug 09 '15 at 19:44
  • I found, heroku use proxy – shuba.ivan Aug 09 '15 at 21:26
  • Hello Ivan, do you solve your problem? – nowiko Aug 12 '15 at 12:35
  • yes I deploy project for Virtual Server and I have ip client $requestStack->getCurrentRequest()->getClientIP() – shuba.ivan Aug 13 '15 at 07:05

0 Answers0