ポストAPIのカスタムログインアクションを作成しました。ポスト API 承認にサードパーティのバンドルは使用しませんでした。ただし、プロジェクトで次のサードパーティ バンドルを使用して REST API を提供しています。ここでカスタム ログイン アクションを共有しました。参考になるかもしれません。私が使用した次のバンドル: JMSSerializerBundle、FOSRestBundle、NelmioApiDocBundle、NelmioCorsBundle、FOSUserBundle
<?php
namespace Yoursite\ApiBundle\Controller;
use FOS\RestBundle\View\View;
use Nelmio\ApiDocBundle\Annotation\ApiDoc;
use FOS\UserBundle\FOSUserEvents;
use Symfony\Component\HttpFoundation\Request;
class UserApiController extends Controller
{
/**
* Response header status code
*
* @var int
*/
private $statusCode = 200;
/**
* This action is used for user signin through api
*
* @ApiDoc(
* resource=true,
* description="User Post action for signin"
* )
*
* @param $request
* @return View view instance
*/
public function postAuthSigninAction(Request $request) {
$responseArr= array();
$view = new View();
$this->statusCode = 200;
$userData = json_decode($request->getContent(), true);
$email = $userData['email'];
$password = $userData['password'];
$um = $this->get('fos_user.user_manager');
$user = $um->findUserByUsernameOrEmail($email);
if (!$user instanceof \YourSite\UserBundle\Entity\User) {
$responseArr['meta']['error'] = "The email address or password is incorrect.";
$this->statusCode = 401;
return $view->create($responseArr, $this->statusCode);
}
$encoder_service = $this->get('security.encoder_factory');
$encoder = $encoder_service->getEncoder($user);
$encoded_pass = $encoder->encodePassword($password, $user->getSalt());
if ($encoded_pass != $user->getPassword()) {
$responseArr['meta']['error'] = "The email address or password is incorrect.";
$this->statusCode = 401;
return $view->create($responseArr, $this->statusCode);
}
$user->setToken(md5($password.time()));
$this->getDoctrine()->getManager()->persist($user);
$this->getDoctrine()->getManager()->flush();
$responseArr['data'] = $user;
return $view->create($responseArr, $this->statusCode);
}
}
?>