Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Create/Login User from a mobile device using Symfony2 and FOSUserBundle

Firstly, I want to create a user sending a post-request from my android app to the server, which uses Symfony2 and the FOSUserBundle.

Finally, I want to login a user from the mobile app and then communicate data with the server.

I know how to implement a post-request on the android-device. But I don't know how I need to configure the FOSUserBundle and security.yml etc to fit my needs. Although I might need a _csrf_token or something and I dont know where to get it from.

I already changed the authentication method from form_login to http_basic and think that this will be the easiest way of doing the authentication (using https to secure the passwords).

But now.. what do I need to do, to achieve the creating and logging in actions without forms? What do I need to put in the post-request on the mobile device?

Thanks for any ideas, comments and solutions!!

like image 926
Stuck Avatar asked May 27 '11 21:05

Stuck


2 Answers

A late answer, but it might help. I'm working on a similar situation and I got this:

In security.yml

security:
providers:
    fos_userbundle:
      id: fos_user.user_manager

firewalls:
    main:
        pattern: ^/
        stateless: true
        http_basic:
            realm: "API"

access_control:
    - { path: /, role: ROLE_USER }

role_hierarchy:
    ROLE_OWNER:       ROLE_USER
    ROLE_SUPER_ADMIN: ROLE_ADMIN

In config.yml:

fos_user:
db_driver: orm
firewall_name: main
user_class: <your user class>

In my test-method:
Reference: Authentication for a Symfony2 api (for mobile app use)

public function testAuthentication() 
{
    $client = $this->createClient();

    // not authenticated
    $client->request('GET', '<url>');
    $this->assertEquals(401, $client->getResponse()->getStatusCode());

    // authenticated
    $client->request('GET', '<url>', array(), array(), array(
        'PHP_AUTH_USER' => '<username from your database>', 
        'PHP_AUTH_PW' => '<password>'
    ));
    $this->assertEquals(200, $client->getResponse()->getStatusCode());

}

For communication with that API, I'd suggest cURL or Buzz

Hope this helps!

Cheers,

Dieter

like image 143
Dieter Avatar answered Sep 25 '22 14:09

Dieter


I had the same problem but I found the solution for registration : (the user enter the username , email and password)

  1. In the UserController of your UserBundle (src/Project/UserBundle/Controller/DefaultController) define a new function registerAction():

     public function registerAction()
    {
        $user = new User();
    
        $request  = $this->getRequest();
        $username = $request->request->get('username');
        $password= $request->request->get('password');
        $email= $request->request->get('email');
    
      $factory = $this->get('security.encoder_factory'); 
    
      $encoder = $factory->getEncoder($user); 
      $password = $encoder->encodePassword($password, $user->getSalt()); 
      $user->setPassword($password); 
    
    
        $user->setUsername($username);
        $user->setUsernameCanonical($username);
        $user->setEmail($email);
        $user->setEmailCanonical($email);
        $user->setEnabled(true);
        $user->setLocked(false);
        $user->setExpired(false);
    
        $user->setCredentialsExpired(false);
        $em = $this->get('doctrine')->getEntityManager();
        $em->persist($user);
        $em->flush();
       /* $response = new Response(json_encode(array('user' => $tes)));
         $response->headers->set('Content-Type', 'application/json');
    
          return $response;*/
          return new JsonResponse('good');
    }
    

    }

and don't forgot to import :

use Symfony\Bundle\FrameworkBundle\Controller\Controller;
use Symfony\Component\Security\Core\Encoder\MessageDigestPasswordEncoder;
use Telifoon\UserBundle\Entity\User;
use Symfony\Component\HttpFoundation\Response;
use Symfony\Component\HttpFoundation\JsonResponse;
  1. in UserBundle/Resources/config/routing.yml add follwoing route:

    inscription_post: pattern: /v1/api/register defaults: { _controller: ProjectUserBundle:Default:register } requirements: _method: POST

  2. My entity ( src/Project/UserBUndle/Entity/User) is :

    use FOS\UserBundle\Model\User as BaseUser;
    
    /**
     * User
     */
    class User extends BaseUser
    {
        public function __construct()
        {
            parent::__construct();
            // your own logic
        }
    }
    
  3. If test the user is added correctely to my database :)

like image 29
Zied R. Avatar answered Sep 23 '22 14:09

Zied R.