2013-02-18 5 views
12

Я пишу приложение с использованием Symfony2, которое будет взаимодействовать с Wordnik REST API.Проверка подлинности Symfony2 через сторонний API REST

В настоящее время API Wordnik не предлагает возможности OAuth, поэтому я должен принять имя пользователя и пароль, которые затем прозрачно перейдут в интерфейс API.

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

Я не думаю, что custom user provider верен, потому что пароль не хранится в моей системе. Все примеры относительно custom authentication providers, по-видимому, относятся к закреплению части приложения как API, а не против API REST.

Непонятно, в какой степени FOSUserBundle помогает решить эту проблему.

Идеальный поток:

  • Пользователь предоставляет учетные данные.
  • Полномочий передаются третья партия REST API
  • Если учетные данные являются правильными:
    • Соответствующим «пользователь третьей стороны» Entity создается моим приложением, если он не существует.
    • Пользователь аутентифицируется с использованием этого пользователя «стороннего пользователя».

Каков наилучший способ осуществить это в контексте безопасности Symfony2?

Спасибо!

Вопросы, относящиеся:

+0

Я борюсь с той же проблемой. Не могли бы вы поделиться своим кодом с тем, как вы это сделали? – Steffan

+0

@Steffan - Прошло 2 года с момента написания этого кода, но вы можете увидеть провайдер/токен, который мы здесь написали: https://github.com/freen/wordrot/tree/584a7b361ba21eb1cf5303949cb6b3d30eecf687/src/WordRot/PlayBundle/ Безопасность/Аутентификация .... при последующих коммитах я удалил бэкэнд PHP вместо того, чтобы вместо этого использовать бэкэнд узла, так что фиксация - это последнее состояние PHP. –

+0

Thx alot, но я нашел более простой способ сделать это с помощью [guard system] (https://knpuniversity.com/screencast/guard/login-form) thx на @DevDonkey из [this] (http: // stackoverflow .com/questions/34376315/symfony2-authenticate-is-not-execute? noredirect = 1 # comment56501487_34376315) сообщение. – Steffan

ответ

4

вы должны реализовать пользовательского поставщика аутентификации, как описано в: http://symfony.com/doc/current/cookbook/security/custom_authentication_provider.html

Я не могу вам сказать, что лучший способ это только для того, чтобы помочь вам начать работу: Вы создаете слушателя, токена, поставщика и фабрики.

Метод tryAuthentication слушателя принимает учетные данные, предоставленные пользователем, и создает новый токен с этим вводом. В конце метода вы добавите: return $ this-> authenticationManager-> authenticate ($ token);

Ваш провайдер будет использовать этот токен в методе аутентификации для отправки запроса API.

Для несуществующих пользователей у вас есть два варианта: - создать пользователь в методе AUTHENTICATE после вызова API и после проверки уже существует ли оно, которое я считаю, НЕ они путь - создать свою собственную проверку подлинности обработчик сбой, который походит https://github.com/symfony/symfony/blob/master/src/Symfony/Component/Security/Http/Authentication/DefaultAuthenticationFailureHandler.php, но в верхней части метода onAuthenticationFailure вы добавляете если ($ исключение InstanceOf UsernameNotFoundException & & (нуль! == $ лексема = $ exception-> getToken()) & & $ лексема InstanceOf YourWordnikToken) { // создаем этого пользователя здесь }

Это просто основная идея, как это работает ... Я на IRC с прозвищем hacfi - дайте мне знать, если вам нужны дальнейшие указания

+0

эй hacfi, я не вижу вас в канале в данный момент :) вы можете найти код моего приложения здесь: https://github.com/freen/wordrot ... Я в настоящее время получаю эту ошибку: 'Неустранимая ошибка: невозможно получить доступ к родительскому объекту :: если текущая область класса не имеет родителя в /[...]/vendor/symfony/symfony/src/Symfony/Component/Security/Core/Authentication/Provider/UserAuthenticationProvider.php в строке 43 ' ... Кажется, что конфигурация немного выключена, если она все еще пытается использовать UserAuthenticationProvider (должен использоваться WordnikProvider). Вы видите какие-либо проблемы с моей реализацией? –

+0

Я буду клонировать репо сегодня и попытаюсь это исправить! – hacfi

+0

Эй Хакфи, спасибо вам за помощь! Я объединил ваш запрос на pull, [решил ошибку аргумента конструктора для поставщика проверки подлинности] (https://github.com/freen/wordrot/commit/0ec3ae9f33bc66fbcdcad668b47de0ee2120d9fe), но я все еще получаю ту же ошибку, что и раньше. –

Смежные вопросы