Разработать и OmniAuth, помня OAuth - PullRequest
18 голосов
/ 18 декабря 2010

Итак, я только что установил с помощью Rails 3, Devise и OmniAuth через https://github.com/plataformatec/devise/wiki/OmniAuth:-Overview.

Я успешно аутентифицирую пользователей через Facebook, но они не «запоминаются», несмотря на то, что помечены:

devise [...]: rememberable, :omniauthable

Я пытался позвонить:

@the_user.remember_me!

... безрезультатно. Файл cookie не сохраняется / не устанавливается, что означает, что пользователь не сохраняется в течение сеансов.

Кто-нибудь сумел запоминать пользователя из FB через куки? На мой взгляд, это должно происходить автоматически.

Спасибо за любые идеи или отзывы, которые вы, ребята, могли бы иметь.

Ответы [ 4 ]

19 голосов
/ 02 февраля 2012

Я хотел бы остановиться на (правильном) ответе @ jeroen-van-dijk, который мне помог.

В config / rout.Rb добавьте новый маршрут в блок devise_for:

devise_for :users, :controllers => {
                     :omniauth_callbacks => "user_omniauth_callbacks" } do
  ...
  get '/users/connect/:network', :to => redirect("/users/auth/%{network}"),
                                 :as => 'user_oauth_connect'

end

Затем измените ссылку «Войти через Facebook», чтобы использовать новый маршрут:

<!-- before it linked to user_omniauth_authorize_path -->
<%= link_to "Sign in using Facebook", user_oauth_connect_path(:facebook) %>

В приложении / controllers / user_omnniauth_callbacks_controller.rb

class UserOmniauthCallbacksController < Devise::OmniauthCallbacksController
  include Devise::Controllers::Rememberable

  def facebook
    @user = User.find(...)
    ...
    remember_me(@user) # set the remember_me cookie
  end
end

Это решение хорошо работает для меня, используя Rails 3.1 и Devise 1.4.9.

11 голосов
/ 09 декабря 2012

Это исправлено разработчиками: Вы должны просто добавить

user.remember_me = true
# then add your signing in code 
sign_in(:user, user)

ref: https://github.com/plataformatec/devise/issues/776#issuecomment-807152

11 голосов
/ 13 января 2011

Я согласен, что вы ожидаете, что Devise установит сессию до того, как запрос отправится в FB.Я предполагаю, что это отсутствующая особенность Devise.

У меня была проблема сама, где я использовал token_authenticatable.Клиент API напрямую вызывал следующий URL:

/users/auth/facebook?auth_token=TnMn7pjfADapMdsafOFIHKgJVgrBEbjKqrubwMXUca0n16m3Hzr7CnrP1s4z

Так как я использовал token_authenticatable, я предполагал, что это войдет в систему пользователя.К сожалению, это не работает из коробки.Чтобы это работало, вам нужно убедиться, что пользователь вошел в систему, прежде чем он попадет по этому пути.Вы можете сделать это другими способами, но самый простой способ - присвоить клиенту API другой URL-адрес (в данном случае «users / connect / facebook»). Вот мое дополнение к файлу маршрутов, которое заставляет его работать (при условии, что у вас естьпользовательская модель с устройством devise, и вы не изменили значения по умолчанию):

authenticate :user do
  get 'users/connect/:network', :to => redirect("/users/auth/%{network}")
end

Это обеспечит правильное создание сеанса, чтобы пользователь узнал его по возвращении из Facebook.

0 голосов
/ 07 мая 2014

fyi - если вы также хотите использовать функцию extend_remember_period в devise - вам нужно принудительно применить это к объекту пользователя в контроллере обратного вызова

добавил одну строку в ответ @ mustafaturan

user.remember_me = true
user.extend_remember_period = true

# then add your signing in code 
sign_in(:user, user)
...