REST API и клиент на одном сервере, нужна аутентификация API?

Во-первых, позвольте мне описать приложение: мы работаем над веб-программным обеспечением, которое представляет собой своего рода специализированное приложение службы поддержки. Для этого требуется, чтобы пользователь выполнил вход (мы используем FOSUserBundle). После авторизации пользователь перенаправляется в панель управления. С панели управления больше нет перезагрузки страницы, интерфейс построен на Angularjs, и пользователь может попасть в любое место в приложении без перезагрузки страницы. Можно говорить об одностраничном приложении.

Таким образом, данные, которые предоставляются пользователю, извлекаются из остальных API (мы используем FOSRestBundle). На данный момент это работает достаточно хорошо.

Есть какая-то дилемма. Только наши сотрудники будут иметь доступ к этому приложению (пока). Таким образом, сотруднику необходимо войти в систему, чтобы получить доступ к службе поддержки. Данные, которые передаются во внешний интерфейс через angularjs, вызываются через API, поэтому пользователю, который только что вошел в систему, необходимо снова аутентифицироваться при каждом запросе из-за отдыха.

Проблема: Так как бэкенд работает на symfony2, давайте просто попробуем получить объект пользователя вошедшего в систему пользователя при вызове API:

$this->get('security.context')->getToken()->getUser()

возвращает anon., что означает анонимный, или

$this->getUser();

возвращает просто null.

Таким образом, аутентифицированный контекст, похоже, исчез при использовании остальных API. Однако, когда я вызываю действие напрямую без отдыха, я могу получить информацию о пользователе.

Итак, что нам нужно, так это защитить наш rest API и получать информацию о пользователе при каждом вызове API. Мы не хотим, чтобы третьи лица имели доступ к нашему приложению, только сотрудники. Я не знаком с OAuth, но пользователь будет перенаправлен на стороннюю страницу, чтобы разрешить/запретить доступ к его данным? Для нас это был бы не вариант.

Основываясь на этой информации, есть ли у вас какие-либо предложения или идеи, как защитить API и транспортировать пользовательские данные, чтобы getUser не возвращал null или anon. но фактически зарегистрированный пользователь?


person Upvote    schedule 25.04.2013    source источник
comment
трудно догадаться, что не так... это, безусловно, ошибка в вашем коде или неправильно сконфигурированный брандмауэр... но, не видя показанного кода, как можно узнать?   -  person mpm    schedule 26.04.2013
comment
@mpm спасибо за ответ, взгляните на мою правку   -  person Upvote    schedule 26.04.2013


Ответы (3)


есть еще один способ решить вашу проблему.

Это с помощью Сертификатов. вы можете сгенерировать сертификаты, а затем использовать туннелирование Http (очевидно, https), сервер запросит сертификат (для этого вам нужно настроить Apache, но это не большая проблема).

при этом вы должны добавить CertificateManager на стороне сервера, чтобы убедиться, что сертификат действителен, и узнать, кто вызывает службу (чтобы иметь возможность аутентифицировать пользователя при каждом запросе), CertificateManager (или что-то еще) я назову это), вероятно, придется настроить внутри себя цепочку фильтров (известную в мире Java), и вуаля

Хоп, это поможет тебе, Абдерразак

person Abderrazak BOUADMA    schedule 26.04.2013

REST не имеет состояния, поэтому вам придется отправлять какую-то аутентификацию/авторизацию в каждом запросе. Вы можете использовать HTTP BASIC AUTH или что-то вроде OAuth.

Взгляните на https://github.com/FriendsOfSymfony/FOSOAuthServerBundle.

Я как бы создаю наше приложение с точно такой же архитектурой (RESTful API с серверной частью Symfony2 и интерфейсом AngularJS.

person Simon    schedule 25.04.2013
comment
+1 за подсказку OAuth. Однако на данный момент мы не хотим раскрывать наш API для сторонних клиентов, поэтому работа с OAuth может быть излишним. Потому что пользователь, обращающийся к приложению в то же время, тоже будет клиентом. Я собираюсь немного расширить свой вопрос. - person Upvote; 26.04.2013
comment
если API используется javascript с того же сервера, вам не нужен openauth. Вы можете использовать сеансы, чтобы проверить, аутентифицирован ли пользователь или нет, если нет, вам нужна как минимум система токенов после аутентификации для авторизации. - person mpm; 26.04.2013
comment
@mpm Звучит многообещающе. Можете ли вы опубликовать это как ответ и немного расширить его, как Fosuserbundle + Session вместо cookie может помочь мне с моей проблемой? - person Upvote; 26.04.2013

Другой способ — дублировать маршруты API, чтобы у вас были маршруты API, защищенные OAUTH, и маршруты API, защищенные сеансом, и оба они указывали на одни и те же контроллеры. Метод был объяснен здесь: https://stackoverflow.com/a/22964736/435026

person fdellutri    schedule 09.04.2014