Как получить данные из заголовка авторизации и использовать их в своем API? (Лексик JWT)

Я занимаюсь созданием SPA (гибридного приложения) с использованием ionic и AngularJS (1.5.x). Я использую Symfony 2.8 для своего бэк-офиса и для обработки своего API.

Я хотел использовать JWT, и я использую для этого пакет Lexik JWT. Все работает нормально. Когда пользователь входит в систему, он получает токен, который затем сохраняется в заголовке Authorization. Только пользователи с этим токеном (вернее, токеном в этом заголовке) могут получить доступ к API и выполнять вызовы API.

Единственное, что мне неясно, это как сделать так, чтобы пользователь мог выполнять только вызовы API (получать информацию о пользователе, обновлять только свои собственные сообщения и т. д.), которые касаются их СОБСТВЕННОЙ информации.

До сих пор я пытался получить данные из заголовка Authorization, чтобы в дальнейшем каким-то образом использовать данные этого токена (имя пользователя там), чтобы проверить, равно ли оно имени пользователя, который сделал этот отчет.

Пробовал несколько вещей, таких как getallheaders(), $token = $_SERVER['Authorization']; и другие общие функции, которые проверяют заголовки запросов, но каждый раз я также получаю ошибки.

Я что-то не понимаю или пропустил шаг? Я неправильно использую JWT? Верны ли мои рассуждения о том, как я должен это делать, или есть более плавный/логичный способ сделать это?

Я также использую FOSRestBundle для своего API, а также NelmioCORS, NelmioApiDoc и FOSUSERBundle.


person wesvb    schedule 12.08.2016    source источник


Ответы (1)


Когда вы находитесь за брандмауэром, предоставляемым пакетом, и если пользователь правильно вошел в систему, вы можете получить объект пользователя из своего контроллера, вызвав методы getToken(), а затем getUser() службы security.token_storage. Если ваш контроллер расширяет Symfony\Bundle\FrameworkBundle\Controller\Controller, вы можете напрямую вызывать $this->getUser().

<?php

namespace AcmeBundle\Controller;

use Sensio\Bundle\FrameworkExtraBundle\Configuration\Route;
use Sensio\Bundle\FrameworkExtraBundle\Configuration\Security;
use Symfony\Bundle\FrameworkBundle\Controller\Controller;

/**
 * @Route("/api")
 */
class ApiController extends Controller
{
    /**
     * @Route("/hello")
     * @Security("is_granted('ROLE_USER')")
     */
    public function helloAction()
    {
        $token = $this->get('security.token_storage')->getToken();
        $if (null !== $token) {
            //$token should be an instance of Lexik\Bundle\JWTAuthenticationBundle\Security\Authentication\Token\JWTUserToken
            $user = $token->getUser();
        }
        // or
        $user = $this->getUser();
        ...
    }
}
person Spomky-Labs    schedule 20.08.2016