使用Google帐户验证Symfony2 REST API

问题描述 投票:0回答:1

我正在使用REST API中的Symfony2和FOSOauthServerBundle。 例如,我希望某些用户可以使用他们的Google帐户通过客户端应用登录。

通过Web,可以从REST服务器通过Web登录我的Google帐户(使用HWIOauthBundle),但是我需要向客户端应用发送一个access_token(就像FOSOauthServerBundle一样)。

我有兴趣将Google发送给我的access_token保留在我的数据库中,同时将Google的json消息{'access_token':'XMekfmns ....}发送给客户端应用(现在是我的REST)也有API)access_token。

我不知道我的方法是否正确。 有任何想法吗?

(对不起我的英语不好 ;-) )

非常感谢你

api rest symfony google-account fosoauthserverbundle
1个回答
0
投票

这是我的(肮脏的)解决方案,但我希望人们理解我想要的。

从客户端,用户发送请求以获取来自Google帐户的授权(我将Symfony2与HWIOauthBundle结合使用)

http://myserver.com/connect/google

这是Google登录表单。 用户填写表格并提交。 如果成功存在,将有一个重定向到myserver.com的用户将在其中登录。

我在onAuthenticationSuccess上捕获了事件...

<?php

namespace App\Bundle\Handler;

use Symfony\Component\Security\Core\Exception\AuthenticationException;
use Symfony\Component\Security\Core\Authentication\Token\TokenInterface;

use Symfony\Component\Security\Http\Authentication\AuthenticationSuccessHandlerInterface;

use Symfony\Component\HttpFoundation\Request,
    Symfony\Component\HttpFoundation\RedirectResponse,
    Symfony\Component\HttpFoundation\JsonResponse;

use Symfony\Component\Routing\Router;

class SecurityHandler implements AuthenticationSuccessHandlerInterface
{

    private $router;

    public function __construct(Router $router)
    {
        $this->router = $router;
    }

    public function onAuthenticationSuccess(Request $request, TokenInterface $token)
    {
        $user = $token->getUser();

        return new RedirectResponse($this->router->generate('api_get_token', array(
            'clientRandomId' => '5ewv02jcis08wsgggk4wow4so0gokco0g4s8kkoc4so4s0gw4c'
        )));
    }
    #clientRandomId value is an existing value in the table (entity) Client ...
    #... in the database.
}

...重定向到Controller,它将在其中生成access_token和refresh_token,并将它们保存在数据库中。 最后,它将像FOSOauthServerBundle一样向用户发送一个json响应。

<?php

namespace App\Bundle\Controller\Api;

use Symfony\Bundle\FrameworkBundle\Controller\Controller,
    Symfony\Component\HttpFoundation\JsonResponse,
    Symfony\Component\Security\Core\Exception\AccessDeniedException;

use FOS\RestBundle\Controller\FOSRestController,
    FOS\RestBundle\Controller\Annotations\Route,
    FOS\RestBundle\Controller\Annotations\NamePrefix,
    FOS\RestBundle\Controller\Annotations\Prefix;

use FOS\RestBundle\Routing\ClassResourceInterface;

use App\Bundle\Entity\AccessToken;
use App\Bundle\Entity\RefreshToken;

class TokenController extends FOSRestController implements ClassResourceInterface {

#this method has the route named 'api_get_token' 

public function getAction($clientRandomId)
{
    $user = $this->get('security.context')->getToken()->getUser();

    #control if user exist ...

    #We force the loggout 
    $this->container->get('security.context')->setToken(null);

    $em = $this->get('doctrine')->getManager();

    $client = $em->getRepository('AppBundle:Client')->findOneBy(array('randomId' => $clientRandomId));

    #control if client exist ...

    $expiresAt = time() + 3600;

    $accessToken = new AccessToken;
    $accessToken->setClient($client);
    $accessToken->setToken('access_token'); #This is only an example
    $accessToken->setExpiresAt($expiresAt);
    $accessToken->setUser($user);

    $refreshToken = new RefreshToken;
    $refreshToken->setClient($client);
    $refreshToken->setToken('refresh_token'); #This is only an example
    $refreshToken->setExpiresAt($expiresAt);
    $refreshToken->setUser($user);

    $em->persist($accessToken);
    $em->persist($refreshToken);
    $em->flush();

    $jsonData = array(
        'access_token' => $accessToken->getToken(),
        'expires_in' => 3600,
        'token_type' => 'bearer',
        'scope' => null,
        'refresh_token' => $refreshToken->getToken()
    );

    $response = new JsonResponse($jsonData);

    return $response;
}}

我知道这不是最佳解决方案,但也许它可以引导您找到更好的解决方案。

© www.soinside.com 2019 - 2024. All rights reserved.