2013-04-25 4 views
3

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

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

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

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

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

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

$this->getUser(); 

возвращает только нуль.

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

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

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

+0

трудно догадаться, что случилось ... это, безусловно, ошибка в вашем коде или брандмауэре неправильно сконфигурирована ... но не видя какого-либо кода, как это можно узнать? – mpm

+0

@mpm thx для ответа, посмотрите на мое редактирование –

ответ

3

есть другой способ, чтобы решить вашу проблему.

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

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

хоп, который поможет вам, Абдерразак

1

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

Посмотри https://github.com/FriendsOfSymfony/FOSOAuthServerBundle

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

+1

+1 для подсказки OAuth. Однако пока мы не хотим раскрывать наш api для сторонних клиентов, поэтому иметь дело с OAuth может быть излишним. Поскольку пользователь, одновременно получающий доступ к приложению, будет клиентом. Я собираюсь немного расширить свой вопрос. –

+1

, если api используется javascript, исходящим с того же сервера, вам не нужно openauth. Вы можете использовать сеансы для проверки подлинности пользователя или нет, если вам не нужна хотя бы маркерная система после авторизации для авторизации. – mpm

+0

@mpm Звучит многообещающе. Можете ли вы опубликовать это как ответ и немного расширить его, как Fosuserbundle + Session вместо cookie поможет мне с моей проблемой? –

0

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