Единый вход в OmniAuth с помощью Devise, invalid_credentials - PullRequest
4 голосов
/ 21 ноября 2011

У меня есть 3 веб-приложения - A, B и C. Приложение A содержит базу данных пользователей. При доступе к Приложению B и Приложению C я хотел бы, чтобы пользователь был перенаправлен в Приложение A для аутентификации, а затем возвращен обратно в любое приложение, к которому он пытался получить доступ. В то же время они должны быть зарегистрированы во всех приложениях. Если у кого-то нет лучшего решения, я использовал комбинированное решение OmniAuth / Devise, как описано в этом сообщении в блоге .

Я разбудил и обновил до Rais 3.1.2 пример приложения A и пример приложения B / C.

Приложение A - Поставщик - https://github.com/RobZolkos/sso-devise-omniauth-provider

Приложение B / C - Клиент - https://github.com/RobZolkos/sso-devise-omniauth-client

Эти примеры приложений работают, и меня перенаправляют в приложение провайдера для аутентификации, но, похоже, оно не аутентифицируется. Я приложил журнал здесь . Похоже, что провайдер выполняет действия, но в строке 26 журнала видно, что, похоже, возникла проблема с аутентификацией.

Я что-то упустил, чтобы заставить эти примеры приложений работать?

Ответы [ 2 ]

2 голосов
/ 06 декабря 2011

Я нашел две проблемы:

  1. Начиная с версии 0.2.1 omniauth изменил имя параметра аутентификации с access_token на oauth_token при получении доступа (запрос POST / oauth / token).
  2. Начиная с версии 0.3.0, omniauth изменил способ передачи oauth_token в запросе на аутентификацию (GET /auth/josh_id/user.json). Предыдущий токен 0.3.0 был пропущен через параметр запроса oauth_token, но с 0.3.0 он стал передаваться через заголовок HTTP_AUTHORIZATION.

Я не знаю, как приятно получить токен из заголовка (я думаю, что его можно получить с помощью devise), поэтому я безобразно хакерский клиент для отправки oauth_token через параметр GET, например, в lib / josh_id.rb:

def raw_info
  @raw_info ||= access_token.get("/auth/josh_id/user.json?oauth_token=#{access_token.token}").parsed
end

Вы можете найти полностью работоспособный код в наших репозиториях на github:

1 голос
/ 21 ноября 2011

У меня нет опыта работы с oauth в rails, но я объясню процесс, который я использовал для создания своего собственного провайдера на Java.Это должно быть легко применить это в рельсах.Если вы используете Devise с omniauth, вам необходимо выяснить, как они поддерживают OAuth и какую версию.

Основы

  • Потребитель входит в приложение и получает consumer_keyи consumer_secret.Это делается с помощью обычной формы, обычно для учетной записи разработчика.
  • (необязательно) Поставщик утверждает созданную учетную запись

  • Все запросы OAuth зависят от правильностиЗаголовок OAuth в запросе.Подходящий заголовок означает:

    1. Все атрибуты oauth и их значения отсортированы в алфавитном порядке
    2. Предоставляются все ключи / токены, активные для конкретного запроса потребителя.
    3. Запрос подписан с использованием всех соответствующих секретов.Секреты известны Поставщику и Потребителю, но не включены в заголовок.
    4. Поставщик генерирует ту же подпись.Если это так, запрос действителен.Одноразовый номер может использоваться для предотвращения повторных атак.

Двусторонний поток (потребитель против провайдера)

  1. Потребитель запрашивает ресурс, предоставляя ключ_потребителя.
  2. Поставщик проверяет подписьна основе consumer_key и consumer_secret
  3. Доступ к ресурсу предоставлен

3-х сторонний поток (человек против потребителя против провайдера)

  1. Ресурс запроса потребителя, предоставляющий егоconsumer_key
  2. Потребитель получает неподписанные oauth_token и oauth_token_secret от провайдера
  3. Пользователь (лицо с учетной записью пользователя в провайдере) входит в систему у провайдера, чтобы авторизовать oauth_token, предоставляющий oauth_request_token и consumer_key
  4. Потребитель имеет авторизованный request_token
  5. Потребитель использует request_token для запроса access_token, предоставляющего oauth_request_token и consumer_key
  6. Поставщик предоставляет access_token и access_token_secret для конкретного ресурса
  7. Потребитель использует access_tokenчто-то сделать
  8. Провайдер делает недействительнымaccess_token через определенное время
  9. Потребитель снова использует request_token для получения нового access_token, если срок его действия истек

Достойным ресурсом для oauth является официальный сайт .3 примера на ножках вы можете найти на игровой площадке google oauth

...