#ruby-on-rails #ruby #oauth #devise #omniauth
#ruby-on-rails #ruby #oauth #разработка #omniauth
Вопрос:
Я могу использовать devise с omniauth (oauth НЕ OpenID) и конфигурацией devise.rb, подобной этой:
config.omniauth :google, KEY, SECRET
и он корректно перенаправляет в Google, чтобы запросить разрешение (и возвращает)…
но, к сожалению, это всегда происходит. Он должен (я полагаю) знать, что я только что авторизовал разрешения на использование Google и должен пропустить это перенаправление в Google после первого раза. Есть предложения о том, как заставить это работать?
Разрешение, о котором я говорю, заключается в следующем: «Сайт blah.com запрашивает доступ к вашей учетной записи Google для продуктов, перечисленных ниже «. Я не хочу, чтобы эта страница всегда появлялась снова.
Ответ №1:
Вам нужно реализовать обратные вызовы самостоятельно — ни Devise, ни Omniauth не предоставляют их вам по умолчанию. Он позаботится об отправке пользователя на вашу конечную точку OAuth и убедится, что он вернется, но он не будет использовать отправленную информацию и / или регистрировать пользователя.
Это зависит от вас, чтобы делать эти вещи.
У Devise есть вики-страница о создании простого контроллера обратного вызова:https://github.com/plataformatec/devise/wiki/OmniAuth:-Overview
У Райана Бейтса есть Railscast о создании более общего контроллера обратного вызова:http://railscasts.com/episodes/236-omniauth-part-2
И у меня также была запись для универсального контроллера обратного вызова:http://blog.impaled.org/code/2011/2/devise-1-2-with-omniauth-on-rails.html
Комментарии:
1. У меня уже есть обратный вызов. К сожалению, к моменту нажатия на контроллер обратного вызова он уже перешел на страницу в Google, запрашивающую доступ. Я должен предположить, что либо у меня может быть обратный вызов до этой страницы, либо каким-то образом monkeypatch разработает, чтобы игнорировать переход на эту страницу, если у меня установлен какой-либо файл cookie.
2. Страница авторизации Google не должна появляться повторно после того, как вы предоставили разрешение. Конечно, он перенаправит на Google, но если вы вошли в систему и ранее предоставили разрешение, он должен перенаправить непосредственно на ваш контроллер обратного вызова. Я никогда не сталкивался с подобной проблемой. Если вы где-нибудь развернете приложение, я мог бы посмотреть.
3. Это одно из тех частных приложений, которые я не могу развернуть в другом месте. Вы случайно не знаете, проверяет ли код devise cookie, или Google просто знает, что вошедший в систему пользователь уже «авторизован» на основе URL, с которого он поступает?
4.Единственными другими важными замечаниями для моей реализации являются: а) в настоящее время у меня не включен SSL (возможно, проблема?); и б) Я добавляю дополнительные области в свою конфигурацию выше: config.omniauth: google, KEY, SECRET, {:scope => «google.com/calendar/feeds docs.google.com/feeds «} . Я был обеспокоен проблемой http vs https.
5. хорошо — извините за поток комментариев, но просто наличие config.omniauth:google, «anonymous», «анонимный» в качестве моей конфигурации все еще заставляет меня повторно авторизовать сайт. gem ‘devise’, ‘1.2.1’, gem ‘omniauth’, ‘0.2.1’.
Ответ №2:
Я обновился до последней версии omniauth / devise gems и использовал google_oauth2 gem (что потрясающе!).
Благодаря этому я смог решить свою проблему, потому что создатель gem добавил parm для предотвращения повторной авторизации.
Смотрите здесь
Ответ №3:
Проверка:https://github.com/intridea/omniauth/pull/342
Google требует, чтобы мы заменили токен долгосрочной авторизации, но я не уверен, что есть чистый способ сделать это с помощью omniauth devise.
Ответ №4:
С помощью omniauth-google-oauth2 я обнаружил, что вам нужно установить
:approval_prompt => ''
в качестве опции в вашей строке
provider :google_oauth2, ...
или вместо этого по умолчанию используется ‘force’, что вызвало у меня ту же проблему.
Вывел это из чтения части об approval_prompt на этой странице:https://github.com/plataformatec/devise/wiki/OmniAuth:-Overview
Ответ №5:
У меня была проблема, из-за которой он запрашивал одни и те же разрешения у пользователя при каждом входе в систему. Я решил это, добавив access_type: "offline"
и approval_prompt: ""
в свою devise.rb
папку config
следующим образом:
config.omniauth :google_oauth2, 'KEYHERE', 'SECRET_HERE', { access_type: "offline", approval_prompt: "", scope: 'userinfo.email,userinfo.profile' }
Описанная выше область позволяет мне видеть основную информацию о пользователе и его адрес электронной почты.
Надеюсь, это поможет.
Ответ №6:
Вы должны включить «Contacts API» и «Google API» через консоль Google API