0
votes

i have problem with HWIOAuthBundle and google authentication, i can't complete work on OAuthProvider. After flush data, i want return entity object, that i saw example somewhere in stackoverflow. But when i return $obj; I catch error :

Catchable Fatal Error: Argument 2 passed to HWI\Bundle\OAuthBundle\Security\Core\Authentication\Token\OAuthToken::__construct() must be of the type array, integer given, called in /var/www/integra/vendor/hwi/oauth-bundle/Security/Core/Authentication/Provider/OAuthProvider.php on line 109 and defined

Construct this class :

public function __construct($accessToken, array $roles = array())
{
    parent::__construct($roles);

    $this->setRawToken($accessToken);

    parent::setAuthenticated(count($roles) > 0);
}

Then i return:

  return new JsonResponse(['accessToken' => $user->getToken(), 'Roles' => $user->getRoles()]);  // I catch error what it loadUserByOAuthUserResponse() must return a UserInterface

class OAuthProvider extends OAuthUserProvider {

    protected $container, $em;

    public function __construct(\Doctrine\ORM\EntityManager $em, $container)
    {
        $this->container = $container;
        $this->em = $em;
    }


public function loadUserByOAuthUserResponse(UserResponseInterface $response)
{
    $email = $response->getEmail();

    if ($email === null) {
        throw new NotFoundHttpException("User email adress not found", 404);
    }

    $name = $response->getFirstName();
    $surname = $response->getLastName();
    $photo = $response->getProfilePicture();



    $repository = $this->em->getRepository('IdamasBillingBundle:User');
    $user = $repository->searchByNameSurnameEmail($email);

    if($user){

        $login = new User();
        $login->setEmail($email);

        $session = $this->container->get('session');
        $session->set('login', $login);

        return $user;

    } else {

        $user = new User();
        $user->setEmail($email);
        $user->setName($name);
        $user->setSurname($surname);
        $user->setPosition('Just user');
        $user->setRoles(1);
        $user->setPhoto($photo);

        $this->em->persist($user);
        $this->em->flush();

        $session = $this->container->get('session');
        $session->set('login', $user); 

//        return $user;f
        return new JsonResponse(['accessToken' => $user->getToken(), 'Roles' => $user->getRoles()]);  
    }

    //return new RedirectResponse("/billing");
}

}

How i can to do it, that redirect to complete login page?

1
$user->setRoles([]); - malcolm
public function setRoles($roles) { $this->roles = $roles; return $this; } - user4685464
And you set roles to 1, this is integer! Roles should be a array in your User object, getRoles must return array, to add role use addRole() method, also why you create new user if user exist? - malcolm
create user if his not exists - user4685464
Really? if($user){ $login = new User(); - malcolm

1 Answers

0
votes

User object should have roles property, and it must be an array:

class User {

    protected $roles = [];

    public function getRoles() {
        return $this->roles;
    }

    public function addRole($role) {
        $this->roles[] = $role;
    }

}