Google oauth через devise и omniauth / oauth, постоянно запрашивающий доступ

#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